我正在 Xcode 6.2 中为 iOS 8.1 构建应用程序。我有一个UIViewController
(LevelViewController
)其中包含一个UICollectionView
每个单元格代表我游戏中的一个级别(每个单元格都有一个带有数字的标签)。一旦选择了其中一个单元格,我就会执行一个显示segueSKScene
它加载该特定级别的所有数据。我还有一个“菜单”按钮,可以执行返回主菜单的显示操作。
从功能上讲,这一切都有效,但是在执行两次转场后我遇到了严重的记忆问题。在查看了仪器之后,似乎当我从LevelViewController
那所有的UILabel
我为每个人添加的UICollectionViewCell
与细胞中包含的所有其他内容一起保留在记忆中。应该只有 192 个标签(针对 192 个级别),但在多次执行此转接之后,乐器中的标签总数总计约为 1000 个。
显然这些没有在内存中被释放,我的理解是 swift 应该处理这个问题,所以我不确定问题是什么。我还应该指出的是UICollectionView
以编程方式添加,并且没有IBOutlets
被使用。
那么我究竟怎样才能摆脱这些标签呢?UICollectionView
当我离开时LevelViewController
。我对此感到非常困惑,它毁了我的圣帕特里克节。因此,出于对爱尔兰一切的热爱,请帮助一个小伙子:)
注:我尝试过的方法
self.collectionView.removeFromSuperView()
self.collectionView = nil
self.collectionView.deleteItemsAtIndexPaths(path)
如果不查看用于执行这些转场的代码,就很难判断。但我猜测问题与视图控制器之间的连接方式有关。
我还有一个“菜单”按钮,可以执行返回主菜单的显示操作。
如果我必须根据上面的语言进行猜测,而不是弹出 Level ViewController (我假设它嵌入在UINavigationController
),您正在尝试使用返回主菜单performSegueWithIdentifier:
这实际上会创建视图控制器的一个新实例并将其推送到导航堆栈上(并保留它的现有实例,从而导致内存问题)。
如果这确实是您的问题,解决方案非常简单:点击菜单按钮时,您应该调用popViewControllerAnimated https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/#//apple_ref/occ/instm/UINavigationController/popViewControllerAnimated: or dismissViewControllerAnimated:completion: https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/dismissViewControllerAnimated:completion:.
当您习惯了 iOS Segueing 时,一件值得做的简单小事就是向所有视图控制器添加反初始化器,如下所示,以便获取对象按预期被释放的持续调试消息:
deinit {
debugPrintln("Name_of_view_controlled deinitialized...")
}
圣帕迪节快乐!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)