正如标题所说,我有一个可以在 iPad 2 上运行的应用程序,但在 iPad 3 上崩溃。运行它时,控制台会给我一个内存不足的警告消息。当崩溃发生时,我用符号表示它,但实际上没有什么可以与代码相关联,就像它显示的那样
process name, UUID, rpages, recent_max, [reason] (state)
在那些列标题下只是十六进制的东西,没有显示项目中的方法调用或行。
有任何想法吗?我是否在代码中遗漏了一些允许更好的崩溃日志的标志?
谢谢。
正如标题所说,我有一个可以在 iPad 2 上运行的应用程序,但在 iPad 3 上崩溃。运行它时,控制台会给我一个内存不足的警告消息。当崩溃发生时,我用符号表示它,但实际上没有什么可以与代码相关联,就像它显示的那样
process name, UUID, rpages, recent_max, [reason] (state)
在那些列标题下只是十六进制的东西,没有显示项目中的方法调用或行。
有任何想法吗?我是否在代码中遗漏了一些允许更好的崩溃日志的标志?
谢谢。
如果您收到内存不足警告并且未能释放足够的内存来解决问题,那么您的应用几乎肯定会崩溃。问题是,我不认为它崩溃的方式或原因的细节可能具有启发性。此时,您正在评估继发症状。您确实需要回过头来弄清楚为什么首先会收到内存不足警告并解决该问题。
正如丹尼尔所说,您可以查看Technical Note 2151,但正如它所说:
当您看到内存不足崩溃时,与其担心终止时代码的哪一部分正在执行,不如调查内存使用模式和对内存不足警告的响应。Memory Allocations Help列出了有关如何使用 Leaks Instrument 发现内存泄漏以及如何使用 Allocations Instrument 的 Mark Heap 功能来避免废弃内存的详细步骤。内存使用性能指南讨论了响应内存不足通知的正确方法以及有效使用内存的许多技巧。还建议您查看 WWDC 2010 会议,使用仪器进行高级内存分析。
所以,有几个想法:
你有没有寻找泄漏?Find Leaks文章将引导您了解如何使用仪器来查找泄漏。
如果你打开了僵尸,你有没有把它们关掉?Zombies 是一个很好的诊断工具,但只是消耗内存。
您是否通过静态分析器运行代码(shift++或在“产品”菜单上选择“分析”)command?B特别是如果使用非 ARC 代码,这会发现很多内存问题。
您是否使用仪器Allocations
工具检查了未解释的增加而没有抵消减少的分配。使用它,您可以运行程序,查看图表上的内存消耗,看看您是否看到在某个点上没有被相应的减少抵消的任何增加。如果是这样,请在图中突出显示这些增加:
例如,在运行分配工具时,按住选项键,然后用鼠标单击并拖动以突出显示时间线的一部分,以确定您要检查的内容。您可能希望专注于分配中的一个高峰。例如,我在我的分配中发现了一个凸起并突出显示它(这是一个非常简单的示例,我在其中创建了一个巨大的数组viewDidLoad
,但希望它能给你这个想法):
请注意,我发现在下部面板中显示调用树很有用,选择“隐藏系统库”以专注于您的代码(以及“反转调用树”)通常很有用。如果你双击 Instruments 中的方法名(在我的例子中,这里是 viewDidLoad),Instruments 会显示你正在分配的代码:
内存不足警告会生成与标准崩溃不同类型的日志。查看本文的“了解内存不足报告”部分,了解您的应用程序发生了什么以及如何使用 Instruments 对其进行调试:http: //developer.apple.com/library/ios/#technotes/tn2151/ _index.html