Swift: 当我转到另一个视图控制器时内存未清除,收到内存警告
Swift: Memory not clearing when I segue to another view controller, recieving memory warning
我正在 Xcode 6.2 中为 iOS 8.1 构建应用程序。我有一个 UIViewController
(LevelViewController
),其中包含一个 UICollectionView
,每个单元格代表我游戏中的一个级别(每个单元格都有一个带数字的标签)。一旦选择了其中一个单元格,我就会对 SKScene
执行显示转场,它会加载该特定 level.I 的所有数据,还有一个 "menu" 按钮,该按钮会执行显示转场回到主界面菜单。
在功能上这一切都有效,但是在执行这两个 segue 之后我遇到了严重的内存问题。在查看仪器后,似乎当我从 LevelViewController
中分离出来时,我为每个人 UICollectionViewCell
添加的所有 UILabel
以及单元格中包含的所有其他内容都保留在内存中.应该只有 192 个标签(192 个级别),但在多次执行此 segue 之后,它们在仪器中加起来约为 1000 个。
显然这些并没有在内存中被释放,我的理解是 swift 应该处理这个问题,所以我不确定问题是什么。我还应该注意到 UICollectionView
是通过编程方式添加的,没有使用 IBOutlets
。
那么,当我离开 LevelViewController
时,我究竟该如何摆脱这些标签,实际上,UICollectionView
本身。我对此感到非常困惑,它毁了我的圣帕特里克节。所以为了爱尔兰人的爱,请帮助一个小伙子 :)
注:我试过的方法
self.collectionView.removeFromSuperView()
self.collectionView = nil
self.collectionView.deleteItemsAtIndexPaths(path)
如果没有看到您用来执行这些转场的代码,很难判断。但我猜这个问题与你如何在视图控制器之间进行 segueing 有关。
I also have a "menu" button which performs a show segue back to the main menu.
如果我不得不根据您上面的语言进行猜测,而不是弹出级别 ViewController(我假设它嵌入在 UINavigationController
中),您正在尝试返回到主菜单使用 performSegueWithIdentifier:
这实际上会创建一个新的视图控制器实例并将其推送到导航堆栈(并保留它的现有实例,从而导致您的内存问题)。
如果这确实是您的问题,解决方案非常简单:点击菜单按钮时,您应该调用 popViewControllerAnimated
or dismissViewControllerAnimated:completion:
。
当您习惯了 iOS segueing 时,一件值得做的简单小事是向所有视图控制器添加取消初始化程序,如下所示,以便获得正在按预期释放对象的持续调试消息:
deinit {
debugPrintln("Name_of_view_controlled deinitialized...")
}
圣帕迪节快乐!
我正在 Xcode 6.2 中为 iOS 8.1 构建应用程序。我有一个 UIViewController
(LevelViewController
),其中包含一个 UICollectionView
,每个单元格代表我游戏中的一个级别(每个单元格都有一个带数字的标签)。一旦选择了其中一个单元格,我就会对 SKScene
执行显示转场,它会加载该特定 level.I 的所有数据,还有一个 "menu" 按钮,该按钮会执行显示转场回到主界面菜单。
在功能上这一切都有效,但是在执行这两个 segue 之后我遇到了严重的内存问题。在查看仪器后,似乎当我从 LevelViewController
中分离出来时,我为每个人 UICollectionViewCell
添加的所有 UILabel
以及单元格中包含的所有其他内容都保留在内存中.应该只有 192 个标签(192 个级别),但在多次执行此 segue 之后,它们在仪器中加起来约为 1000 个。
显然这些并没有在内存中被释放,我的理解是 swift 应该处理这个问题,所以我不确定问题是什么。我还应该注意到 UICollectionView
是通过编程方式添加的,没有使用 IBOutlets
。
那么,当我离开 LevelViewController
时,我究竟该如何摆脱这些标签,实际上,UICollectionView
本身。我对此感到非常困惑,它毁了我的圣帕特里克节。所以为了爱尔兰人的爱,请帮助一个小伙子 :)
注:我试过的方法
self.collectionView.removeFromSuperView()
self.collectionView = nil
self.collectionView.deleteItemsAtIndexPaths(path)
如果没有看到您用来执行这些转场的代码,很难判断。但我猜这个问题与你如何在视图控制器之间进行 segueing 有关。
I also have a "menu" button which performs a show segue back to the main menu.
如果我不得不根据您上面的语言进行猜测,而不是弹出级别 ViewController(我假设它嵌入在 UINavigationController
中),您正在尝试返回到主菜单使用 performSegueWithIdentifier:
这实际上会创建一个新的视图控制器实例并将其推送到导航堆栈(并保留它的现有实例,从而导致您的内存问题)。
如果这确实是您的问题,解决方案非常简单:点击菜单按钮时,您应该调用 popViewControllerAnimated
or dismissViewControllerAnimated:completion:
。
当您习惯了 iOS segueing 时,一件值得做的简单小事是向所有视图控制器添加取消初始化程序,如下所示,以便获得正在按预期释放对象的持续调试消息:
deinit {
debugPrintln("Name_of_view_controlled deinitialized...")
}
圣帕迪节快乐!