使用 < 256 RAM iOS 设备时应用程序在启动时崩溃

Posted

技术标签:

【中文标题】使用 < 256 RAM iOS 设备时应用程序在启动时崩溃【英文标题】:App crashes on launch with < 256 RAM iOS Devices 【发布时间】:2012-07-05 02:46:14 【问题描述】:

信息

我最近在 AppStore 上推出了一款应用。在模拟器上测试了数千次,在实际设备上测试了数百次后,我们终于发布了我们的应用程序。

问题

当用户启动应用程序时,开始弹出有关应用程序崩溃的评论。我们发现应用在 RAM 小于(或等于)256 Mb 的 iOS 设备上启动时会崩溃。以下设备是我们的应用支持的设备,数量少于 256:

iPod Touch 4G iPhone 3GS iPad 1

应用程序并不总是崩溃。有时它启动良好并且运行平稳。其他时候它会崩溃。从启动(当用户点击图标时)到崩溃的时间通常是两秒,这意味着系统不会关闭它。

调查结果

在某些设备上使用 Instruments 进行测试时,我发现如下:

    没有内存泄漏(我使用的是 ARC),但有内存警告 项目正在疯狂分配。有这么多分配的项目,即使我使用的是 ARC,它 好像 ARC 没有做它应该做的事情

    由于我认为是“过度分配”,结果是:

    此应用程序(平均)占用 60 MB 实际内存和 166 MB 虚拟内存。当应用程序启动时,正在使用的内存迅速增加,直到达到大约 60 MB,此时视图已加载。 这是 Instruments 中活动监视器的快照:

我知道这些数字太高了(尽管 CPU % 从未真正达到过那里)。我担心 ARC 不能正常工作,或者更可能的情况是:我没有正确分配对象。 可能会发生什么?

代码和警告

在 Xcode 中,只有几个警告,没有一个与应用启动或与应用启动相关的任何文件有关。我在 App Delegate 和我的 viewDidLoad 方法中都设置了断点,以检查崩溃是否在那里发生 - 它没有。

更多背景信息

此外,Xcode 永远不会在调试器中生成任何错误或消息。 iTunes Connect 中也没有崩溃报告,它只是说,“提交的报告太少,无法显示报告。”我已经向我的应用添加了崩溃报告,但我还没有发布那个版本。

几个问题

我刚在 ARC 到来时就开始使用 Obj-C,所以我是处理内存、分配等方面的新手(这可能很明显),但我想知道一些事情: 如何使用@autoreleasepool 来减少对内存的影响?我如何处理内存警告,我在didRecieveMemoryWarning 中写什么,因为我使用的是 ARC? 删除 NSLog 语句是否有助于加快处理速度?

还有最重要的问题:

为什么我的应用会占用如此多的内存,我如何才能减少高达 60 MB 的占用空间?

非常感谢任何帮助!提前致谢!

编辑:在 iPhone 4 (A4) 上进行测试后,我们注意到该应用在运行时不会崩溃,而在 RAM 小于 256 MB 的设备上却会。

【问题讨论】:

您没有从设备访问崩溃日志吗? @sergio 在 iTunesConnect 中没有崩溃日志:“提交的报告很少” 正是由于这些原因,将崩溃报告器添加到您的应用程序中确实很有帮助。我的经验:zx81.org.uk/computing/opinion/… @StephenDarlington 那么除了尝试猜测问题之外我无能为力吗(直到我与崩溃报告者一起更新)? @RazorSharp 知道 何时 它崩溃足以让我在某些情况下找出问题所在。但如果你不能,我不确定除了购买基于 A4 的设备之外你还能做些什么。 【参考方案1】:

我终于解决了这个问题。我花了几个小时思考为什么我的应用程序可能比愤怒的小鸟或涂鸦跳跃占用更多的 RAM。这没有任何意义,因为我的应用没有 CALayer 绘图、复杂的 Open GL 图形渲染或繁重的网络连接。

我在搜索答案时发现了这个slideshow,幻灯片 17 列出了减少内存占用的方法。突出的一件事是 PNGCrush(图形压缩)。

我的应用程序包含大量自定义图形(PNG 文件),但我没有想到它们会以任何方式影响我的应用程序,显然 图像(如果未正确优化)会严重增加应用程序的内存占用强>。

安装 PNGCrush 并在一个特别大的图像 (3.2 MB) 上使用它,然后删除一些未使用的图像后,我最终将我的应用程序内存占用从 60+ MB 和严重滞后减少到 35 MB并且没有滞后。这花了五分钟的时间。

我还没有完成“粉碎”我所有的图像,但是当我完成时,我会向大家更新最终的内存占用情况。

对于所有感兴趣的人,这里有一个blog that explains how to install PNGCrush 的链接(它相当复杂)。

更新:我现在使用了一个名为 ImageOptim 的程序,而不是使用 PNGCrush 进程(这很有帮助,虽然对大量图像很耗时)用于多个脚本的 GUI,例如 PNGCrush。这里有一个简短的描述:

ImageOptim 无缝集成了各种优化工具:PNGOUT、Ad***G、PNGCrush、扩展 OptiPNG、JpegOptim、jpegrescan、jpegtran 和 Gifsicle。

这是网站的link,可免费下载 OS X 10.6 - 10.8。请注意,我不是该软件的开发者、发布者或广告商。

【讨论】:

以上是关于使用 < 256 RAM iOS 设备时应用程序在启动时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Flash 移动应用程序:设备和分析器上的不同 RAM 消耗

ram使用的注意事项

响应 iOS 中的 RAM 可用性

在 iPad 上加载 > 256MB 的文件时应用程序崩溃

单片机内存不够的问题!

管道及IO重定向