设备上的内存警告,而不是仪器

Posted

技术标签:

【中文标题】设备上的内存警告,而不是仪器【英文标题】:Memory Warning on the device, not with Instruments 【发布时间】:2012-11-13 06:46:03 【问题描述】:

我有一个巨大的同步过程,我在其中下载并解压缩 400-500 个XML 文件,然后解析它。有了这些数据,我将在RestKit API 上创建很多核心数据对象。一开始,我有一个内存警告,实时字节为 450mb+,因为我没有使用自动释放池,只尝试在最后保存核心数据。

我修复了这个问题,现在经常保存到核心数据并使用 @autoreleasepool 块。当我现在使用仪器运行我的应用程序时,我可以看到实时字节如何只有 20mb-30mb,总是释放内存并且永远不会变大。这个过程很有效。但是当我在没有仪器的情况下启动应用程序时,在查看文件后我得到一个Memory Warning。后来应用程序崩溃。

使用和不使用instruments 工具运行应用程序有什么区别?为什么结果不同?

【问题讨论】:

一个区别是,通常使用 Instruments 进行分析会导致生成发布版本,而通过 Xcode 运行会导致生成调试版本。但不确定这会如何影响这种情况。 例如,您可以在调试配置中启用 Zombies,但在发布配置中不启用 伙计们——我就是喜欢这个平台。我只是不知道仪器正在使用发布版本。因为我的对象太大了,所以启用僵尸失败了。当我使用发布版本时,一切都像魅力一样工作。请给出它作为答案,以便我可以接受它。你不知道它对我有多大帮助。非常感谢:) 【参考方案1】:

我添加这个答案是因为我很高兴看到这个页面。

@borrrden 的建议部分正确。您可以配置配置文件时将使用的构建设置。要配置它,转到 Xcode 并打开 Edit Scheme 对话框并在左侧菜单中选择 Profile XXX.app。您将看到您可以选择构建配置(调试或发布)。

@hooleyhoop 的评论对于找到解决方案更为关键。即使您的 Profile Build Configuration 设置为 Debug,Profiling 和 Xcode 中的默认 Run 之间仍然存在差异。您可以在 Run 部分中指定 Diagnostics。在那里,在内存管理下有一个名为Enable Zombie Objects的选项。确保此选项未选中

分析时不使用这些诊断运行设置。这就是您正在经历的行为的解释。配置文件部分也没有诊断选项卡。


结果是我的游戏(阿甘正传)在启用 Zombie Objects 的主菜单中无操作 5 分钟后崩溃。一旦我禁用了 Zombie Objects,我的游戏就可以无限运行。 45 分钟后,仍然没有内存警告。

【讨论】:

这是因为启用 Zombies 会故意泄漏所有对象,以便能够在向死对象发送消息时进行跟踪。 好的,这就是原因。我不确定。感谢那。我认为它仍然处于打开状态是很容易忘记的。

以上是关于设备上的内存警告,而不是仪器的主要内容,如果未能解决你的问题,请参考以下文章

使用仪器收到内存警告

内存泄漏仪器警告

应用程序收到内存不足警告但只有 5.7MB 的活动字节

Instruments 指出内存不足警告,但内存使用率非常低

使用少量内存时 ipad 应用程序内存警告

didreceivememorywarning 上的适当低内存警告消息!