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...")
}

圣帕迪节快乐!