【问题标题】:Swift: Memory not clearing when I segue to another view controller, recieving memory warningSwift:当我转到另一个视图控制器时,内存没有清除,收到内存警告
【发布时间】:2015-03-18 01:35:46
【问题描述】:

我正在 Xcode 6.2 中为 iOS 8.1 构建应用程序。我有一个UIViewController (LevelViewController),其中包含一个UICollectionView,其每个单元格都代表我游戏中的一个级别(每个单元格都有一个带有数字的标签)。一旦选择了其中一个单元格,我就会对SKScene 执行显示转场,该SKScene 会加载该特定级别的所有数据。我还有一个“菜单”按钮,它执行返回主菜单的显示转场。

从功能上讲,这一切都有效,但是在执行两个 segue 后我遇到了严重的记忆问题。在查看仪器后,似乎当我从LevelViewController 中分离出来时,我为每个人添加的所有UILabel UICollectionViewCell 以及单元格中包含的所有其他内容都保留在内存中。应该只有 192 个标签(对于 192 个级别),但在多次执行此 segue 之后,它们在仪器中加起来约为 1000 个。

显然这些并没有在内存中被释放,我的理解是 swift 应该解决这个问题,所以我不确定问题是什么。我还应该注意UICollectionView 是以编程方式添加的,并且没有使用IBOutlets

那么,当我远离LevelViewController 时,我究竟如何才能摆脱这些标签,以及真正的UICollectionView 本身。我对此感到非常困惑,这毁了我的圣帕特里克节。所以为了爱爱尔兰人,请帮助一个小伙子:)

注意:我尝试过的方法

self.collectionView.removeFromSuperView()
self.collectionView = nil
self.collectionView.deleteItemsAtIndexPaths(path)

【问题讨论】:

  • 我建议你使用 unwind segue,因为你的应用是基于故事板的。对于您的特定情况,它提供了更多的一致性,而不是使用 popViewCONtrollerAnimated。

标签: ios swift memory xcode6 uicollectionview


【解决方案1】:

如果不查看您用于执行这些转场的代码,就很难判断。但我猜这个问题与你在视图控制器之间的切换方式有关。

我还有一个“菜单”按钮,它执行显示转回主菜单。

如果我不得不根据您上面的语言进行猜测,而不是弹出 Level ViewController(我假设它嵌入在 UINavigationController 中),您正在尝试使用 performSegueWithIdentifier: 回到主菜单实际上将创建视图控制器的一个新实例并将其推送到导航堆栈(并保留它的现有实例,从而导致您的内存问题)。

如果这确实是您的问题,解决方案非常简单:当您的菜单按钮被点击时,您应该调用popViewControllerAnimateddismissViewControllerAnimated:completion:

当您习惯了 iOS segueing 时,值得做的一件简单的小事是向您的所有视图控制器添加反初始化器,如下所示,以便获得正在按预期释放对象的持续调试消息:

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

圣帕迪节快乐!

【讨论】:

  • 这对你有用吗?如果确实如此,我希望您将其标记为已接受的答案。我正在努力赚取更多积分,以便获得一些我需要的 stackoverflow 特权。 :)
  • 嘿兄弟,很抱歉回复晚了。这完美!你是救生员,你应该得到世界上所有的 SO 特权!干杯
  • 哈哈,真棒。很高兴听到这个消息,并感谢您的检查! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2011-08-18
  • 2013-10-31
相关资源
最近更新 更多