1

我正在使用一个相当复杂的基于故事板的 iPad 应用程序。我的工作流程如下一个集合视图推送另一个视图,它以模态方式呈现另一个视图。

模态呈现的第三个视图相当复杂,有 19 个子视图,其中一些是图像视图。该应用程序在 viewDidLoad 中组织视图层次结构方面做了很多工作。viewWillAppear 或 viewDidAppear 中没有其他内容。

困扰我的是,如果我将日志记录语句放在 viewDidLoad 中,我会看到 viewDidLoad 在用户启动故事板 segue 后的 1.5 秒内完成。然后调用 viewWillAppear。之后,屏幕会在那里停留 3 到 80 秒(是的,八十秒!)。有时视图显示相对较快,有时则需要很长时间。

这是我的 viewDidLoad 占用太多内存的症状吗?换句话说,延迟是因为iOS清理了足够的内存以使我的视图出现吗?

在 xCode 中点击停止按钮后,我重新启动应用程序,执行一系列步骤以呈现视图控制器,这是第一次运行:

/

/80 seconds!
    2013-03-27 22:56:30.311 iconmaker[2076:907] -[GLFirstViewController viewWillAppear:] [Line 597] viewWillAppear
    2013-03-27 22:57:50.351 iconmaker[2076:907] -[GLFirstViewController viewDidAppear:] [Line 604] viewDidAppear

//after popping the view controller and repeating:
//less than 2 seconds
2013-03-27 22:59:23.698 iconmaker[2076:907] -[GLFirstViewController viewWillAppear:] [Line 597] viewWillAppear
2013-03-27 22:59:24.306 iconmaker[2076:907] -[GLFirstViewController viewDidAppear:] [Line 604] viewDidAppear

更新:关闭设备,然后重新启动后,视图控制器显示非常快,第一次运行不到 2 秒。这是推送/弹出控制器 4 次后的分配分析。

在此处输入图像描述

这是内存释放问题吗?

4

1 回答 1

1

在分析应用程序后,我发现有两个问题在起作用:

1) 我将大型 UIImages 作为二进制数据保存到 coredata 中,如果使用 NSFetchedResultsControllers,则不应这样做,因为它们会提取所有图像数据并将其保存在内存中。

2) iOS6 改变了 viewDidUnload 的工作方式——它永远不会被调用,所以我添加了一些调用来在我的视图控制器消失时手动释放对象。

最终结果是内存占用现在大约为 4mb 基线,随着我推动以前有问题的控制器而变得更高。此外,我可以多次推送/弹出控制器而不会出现内存不足的崩溃。

在此处输入图像描述

于 2013-04-01T04:07:05.043 回答