Swift:内存不清除,当我继续到另一个视图控制器,接收内存警告

我正在Xcode 6.2中build立一个应用程序,用于iOS 8.1。 我有一个UIViewControllerLevelViewController ),其中包含一个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被轻敲,你应该调用popViewControllerAnimateddismissViewControllerAnimated:completion:

习惯于iOS截图的一个简单的小事情就是为所有的视图控制器添加去初始化器,如下所示,以获得持续的debugging消息,按照预期方式释放对象:

 deinit { debugPrintln("Name_of_view_controlled deinitialized...") } 

圣帕特里克节快乐!