应用程序在iPad 2上正常工作,在iPad 3上崩溃,内存不足警告

问题描述:

正如标题所示,我有一个可在iPad 2上运行的应用程序,但在iPad 3上崩溃。运行时,控制台给我的内存不足警告信息。当碰撞发生了,我symbolicate它,但没什么好说的,我可以涉及到的代码,就像它显示应用程序在iPad 2上正常工作,在iPad 3上崩溃,内存不足警告

process name, UUID, rpages, recent_max, [reason] (state) 

,并根据这些列标题只是十六进制的东西,没有什么显示方法调用或项目行。

任何想法?我是否在允许更好的崩溃日志的代码中缺少一些标志?

谢谢。

+0

是iOS版两台设备上的版本完全相同? iPad 3是否会一直在同一个地方或每次不同的地方坠毁?是否适用于所有的iPad 3,或仅仅是一些(或一个)?你是否在'didReceiveMemoryWarning'例程中释放了大量内存? – Rob 2013-03-05 23:17:51

如果您获取的内存不足警告并且未能释放足够的内存为了解决这个问题,你的应用几乎肯定会崩溃。问题是,我不认为它坠毁的详情或原因可能是照亮的。此时,您正在评估次要症状。你真的需要回去找出为什么你首先得到了低内存警告并解决了这个问题。

正如丹尼尔说,你可以看看Technical Note 2151,但因为它说:

当你看到一个低内存崩溃,而不是被关心你的代码的哪一部分在终止时正在执行,您应该调查您的内存使用模式以及对低内存警告的响应。 Memory Allocations Help列出了如何使用泄漏工具发现内存泄漏的详细步骤,以及如何使用分配工具的Mark Heap功能来避免遗弃的内存。 Memory Usage Performance Guidelines讨论了响应低内存通知的正确方法以及有效使用内存的许多技巧。还建议您查看WWDC 2010会话Advanced Memory Analysis with Instruments

所以,一对夫妇的想法:

  1. 你有没有找过泄漏?文章将指导您如何使用仪器来查找泄漏。

  2. 如果你打开僵尸,你有没有把它们关闭?僵尸是一个很好的诊断工具,但只是消耗内存。

  3. 你有没有通过静态分析仪运行的代码(以下简称“产品”菜单上转变 + 命令 + 或选择“分析”)?特别是如果使用非ARC代码,这可能会发现很多内存问题。

  4. 您是否检查过您的分配原因,并且未使用仪器的Allocations工具进行抵消减少。使用它,您可以运行该程序,查看图形上的内存消耗情况,并查看是否有任何增加量在某个时间点没有被相应的减少量所抵消。如果是这样,请突出显示图中的增加值:

    例如,运行分配工具时,请按住选项键,然后用鼠标单击并拖动以突出显示部分时间轴,以确定你想检查。您可能希望关注您的某个分配高峰。例如,我发现了一个凸起在我的分配,并强调它是这样(这是在我创建viewDidLoad一个巨大的数组一个可笑简单的例子,但希望它给你的想法):

    allocations

    注,我发现在下面的面板中显示调用树很有用,通常选择“隐藏系统库”很有用,可以专注于你的代码(也可以是“反向调用树”)。如果你在仪器方法的名称,双击(在我的例子,在这里,这将是viewDidLoad中),仪器便会显示您的代码,在做分配:

    show code

+0

谢谢,这真的很有帮助,但为什么这只会发生在iPad 3?它的内存比iPad 2少吗? – Huang 2013-03-05 22:47:40

+0

@黄不,它有更多。所以如果你得到一些内存警告,这意味着你有一些令人震惊的内存消耗发生。您可以查看配置(iOS版本,视网膜与非视网膜,wifi v蜂窝设置等)的差异,但对于低内存警告,我会专注于泄漏和分配。花费大量时间查看碰撞日志有点像在山谷中观察汽车的残骸,在这里分析由碰撞引起的扭曲金属的性质通常与导致汽车驶离的原因无关首先是悬崖。 – Rob 2013-03-05 23:13:43

低内存警告生成与标准崩溃不同的日志类型。阅读本文的“理解低内存报告”一节,了解您的应用程序发生了什么以及如何使用仪器进行调试:http://developer.apple.com/library/ios/#technotes/tn2151/_index.html

+0

谢谢,这使我走上正轨。 – Huang 2013-03-04 22:50:37