ios - Swift:当我转到另一个 View Controller 时,内存未清除,收到内存警告

标签 ios swift memory xcode6 uicollectionview

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

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

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

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

注意:我试过的方法

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

最佳答案

如果没有看到您用来执行这些转场的代码,很难判断。但我猜这个问题与你如何在 View Controller 之间进行 segueing 有关。

I also have a "menu" button which performs a show segue back to the main menu.

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

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

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

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

圣帕迪节快乐!

关于ios - Swift:当我转到另一个 View Controller 时,内存未清除,收到内存警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29112756/

相关文章:

c - 返回前释放内存

caching - 更大的缓存大小是否总是会提高性能?

arrays - Swift 字符串相等

Swift - 我的收藏 View 没有输出额外的数量

c - 如何在C/C++中将二维数组的指针赋给内存地址

ios - initWithCoder : and initWithFrame: 之间共享初始化方法的命名约定

swift - 类型 'NSArray?.Type' 不符合协议(protocol) 'Sequence'

ios - 从 .xib 文件加载接口(interface)的自定义 UIView 类中出现错误

ios - 带有放大镜且没有键盘的 UITextView

ios - MKAnnotation不显示相应的图标