Swift:内存不清除,当我继续到另一个视图控制器,接收内存警告
我正在Xcode 6.2中build立一个应用程序,用于iOS 8.1。 我有一个UIViewController
( LevelViewController
),其中包含一个UICollectionView
其单元格代表我的游戏中的一个级别(每个人都有一个数字标签)。 一旦选中了其中一个单元格,我将执行一个显示segue到一个SKScene
,它将加载该特定级别的所有数据。我还有一个“菜单”button,它执行一个show segue回到主菜单。
在function上,这一切工作,但是我执行两个赛段后有严重的记忆问题。 在仪器中窥视之后,看来当我从LevelViewController
,为每个单独的UICollectionViewCell
添加的所有UILabel
都保留在内存中,以及单元中包含的所有其他内容。 应该只有192个标签(对于192个级别),但是在执行了几次这个分段之后,他们在仪器中加起来大约为1000个。
显然这些内存没有被释放,我的理解是swift应该处理这个问题,所以我不确定问题是什么。 我还应该注意到UICollectionView
是以编程方式添加的,并且没有使用IBOutlets
。
那么我怎么能摆脱这些标签,实际上,当我离开UICollectionView
时候, UICollectionView
本身就是LevelViewController
。 我对此非常困惑,并且毁了我的圣帕特里克日。 所以对于所有事情的爱情爱尔兰请帮助一个小伙子:)
注:我试过的方法
self.collectionView.removeFromSuperView() self.collectionView = nil self.collectionView.deleteItemsAtIndexPaths(path)
没有看到你用来执行这些代码的代码很难说。 但我猜这个问题与你如何在视图控制器之间延续有关。
我也有一个“菜单”button,执行显示继续回到主菜单。
如果我不得不根据上面的语言来猜测,而不是popupLevel ViewController(我假设它embedded在UINavigationController
),那么您正尝试使用performSegueWithIdentifier:
继续回到主菜单performSegueWithIdentifier:
这实际上会创build一个新的实例的视图控制器,并将其推到导航堆栈(并保留现有的实例导致您的内存困境)。
如果这确实是你的问题,解决scheme很简单:当你的菜单button被轻敲,你应该调用popViewControllerAnimated
或dismissViewControllerAnimated:completion:
。
习惯于iOS截图的一个简单的小事情就是为所有的视图控制器添加去初始化器,如下所示,以获得持续的debugging消息,按照预期方式释放对象:
deinit { debugPrintln("Name_of_view_controlled deinitialized...") }
圣帕特里克节快乐!