设备上的内存警告,而不是仪器
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 会故意泄漏所有对象,以便能够在向死对象发送消息时进行跟踪。 好的,这就是原因。我不确定。感谢那。我认为它仍然处于打开状态是很容易忘记的。以上是关于设备上的内存警告,而不是仪器的主要内容,如果未能解决你的问题,请参考以下文章