应用程序在 iPad 2 上运行良好,在 iPad 3 上崩溃,内存不足警告

Posted

技术标签:

【中文标题】应用程序在 iPad 2 上运行良好,在 iPad 3 上崩溃,内存不足警告【英文标题】:app works fine on iPad 2, crashes on iPad 3, with low memory warning 【发布时间】:2013-03-04 22:01:37 【问题描述】:

正如标题所说,我有一个在 iPad 2 上运行的应用程序,但在 iPad 3 上崩溃。运行它时,控制台给我一个内存不足的警告消息。当崩溃发生时,我将其符号化,但实际上没有什么可以与代码相关联,就像它显示的那样

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

在那些列标题下只是十六进制的东西,没有显示项目中的方法调用或行。

有什么想法吗?我是否在代码中遗漏了一些允许更好的崩溃日志的标志?

谢谢。

【问题讨论】:

两台设备上的ios版本是否相同? iPad 3 总是在同一个地方崩溃,还是每次都在不同的地方崩溃?它适用于所有 iPad 3,还是仅适用于一些(或一个)?您是否在 didReceiveMemoryWarning 例程中释放了大量内存? 【参考方案1】:

如果您收到内存不足警告并且未能释放足够的内存来解决问题,您的应用几乎肯定会崩溃。问题是,我不认为它崩溃的方式或原因的细节可能具有启发性。此时,您正在评估继发症状。你真的需要回去弄清楚为什么你首先会收到内存不足的警告并解决这个问题。

正如丹尼尔所说,您可以查看Technical Note 2151,但正如它所说:

当您看到内存不足崩溃时,与其担心终止时正在执行的代码部分,不如调查内存使用模式以及您对内存不足警告的响应。 Memory Allocations Help 列出了有关如何使用 Leaks Instrument 发现内存泄漏以及如何使用 Allocations Instrument 的 Mark Heap 功能避免废弃内存的详细步骤。 Memory Usage Performance Guidelines 讨论了响应内存不足通知的正确方法以及有效使用内存的许多技巧。还建议您查看 WWDC 2010 会议,Advanced Memory Analysis with Instruments。

所以,有几个想法:

    您是否查找过泄漏? Finding Leaks 文章将引导您了解如何使用仪器来查找泄漏点。

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

    您是否通过静态分析器(shift+command+B 或在“产品”菜单)?特别是如果使用非 ARC 代码,这会发现很多内存问题。

    您是否使用仪器的Allocations 工具检查了分配中无法解释的增加而未抵消减少的情况。使用它,您可以运行程序,查看图表上的内存消耗,看看您是否看到在某个点上没有被相应的减少抵消的任何增加。如果是这样,请在图表中突出显示这些增加:

    例如,在运行分配工具时,按住选项键,然后用鼠标单击并拖动以突出显示时间线的一部分,以确定您要检查的内容。您可能希望专注于分配中的一个高峰。例如,我在分配中发现了一个凹凸并突出显示它(这是一个非常简单的示例,我在 viewDidLoad 中创建了一个巨大的数组,但希望它能给你这个想法):

    注意,我发现在下部面板中显示调用树很有用,选择“隐藏系统库”以专注于您的代码(以及“反转调用树”)通常很有用。如果您双击 Instruments 中的方法名称(在我的示例中,此处为 viewDidLoad),Instruments 将显示您正在执行分配的代码:

【讨论】:

谢谢,这真的很有帮助,但为什么这只会发生在 iPad 3 上?它的内存是否比 iPad 2 少? @Huang 不,还有更多。因此,如果您收到一些内存警告,则意味着您正在发生一些令人震惊的内存消耗。您可以查看配置的差异(iOS 版本、retina v 非视网膜、wifi v 蜂窝设置等),但对于内存不足警告,我将关注泄漏和分配。花大量时间查看碰撞日志有点像在峡谷中查看汽车残骸,其中分析由撞击导致的扭曲金属的性质通常与导致汽车开走的原因无关首先是悬崖。【参考方案2】:

内存不足警告生成的日志类型与标准崩溃不同。查看本文的“了解内存不足报告”部分,了解您的应用程序发生了什么以及如何使用 Instruments 对其进行调试:http://developer.apple.com/library/ios/#technotes/tn2151/_index.html

【讨论】:

以上是关于应用程序在 iPad 2 上运行良好,在 iPad 3 上崩溃,内存不足警告的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在 iPhone 上运行良好; iPad模拟器只给出黑屏

iPad 应用程序在设备上崩溃

我如何获得一个运行良好的 iPhone 应用程序,就像在 iTunes 商店为 iPad 列出的 iPad 上一样?

AVAssetExportSession 在 iPad 上工作,在 iPhone 上没有音频

xcode UI 自动化脚本在 iPhone 上运行良好,但在 iPad 上失败

在不同版本的 iPad 上运行应用程序