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

Sam*_*cer 4 memory crash performance memory-management objective-c

信息

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

问题

当用户启动应用程序时,评论开始出现应用程序崩溃.我们认为该应用程序在iOS设备上的启动时崩溃,其RAM少于(或等于)256 Mb.以下设备是我们的应用程序支持的设备少于256:

  • iPod Touch 4G
  • iPhone 3GS
  • iPad 1

该应用程序并不总是崩溃.有时它发射很好并且运行顺畅.其他时候它崩溃了.从启动(用户点击图标)到崩溃的时间通常是两秒钟,这意味着系统没有关闭它.

发现

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

  1. 没有内存泄漏(我正在使用ARC),但有内存警告
  2. 物品被分配得像疯了一样.有很多分配的项目,即使我使用ARC,就好像ARC没有做它应该做的事情
  3. 由于我所谓的"过度分配",结果是:

    这个应用程序(平均)需要60 MB的实内存和166 MB的虚拟内存.当应用程序启动时,正在使用的内存会快速增加,直到达到大约60 MB,此时视图已加载.以下是仪器中活动监视器的快照: 在此输入图像描述

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

守则和警告

在Xcode中,只有少数警告,其中没有一个与应用程序启动或与启动应用程序相关的任何文件有关.我在App Delegate和我的viewDidLoad方法中都设置了断点,以检查崩溃是否发生在那里 - 事实并非如此.

更多背景信息

此外,Xcode从不在调试器中生成任何错误或消息.iTunes Connect中也没有崩溃报告,它只是说,"提交报告的报告太少了." 我已将崩溃报告添加到我的应用程序中,但我还没有发布该版本.

几个问题

当ARC到达时我开始使用Obj-C,所以我不熟悉处理内存,分配等等(这可能是显而易见的)但是我想知道一些事情:我怎样才能@autoreleasepool用来减少记忆影响?我怎么处理内存警告,didRecieveMemoryWarning自从我使用ARC以来,我该怎么写?删除NSLog语句有助于加快速度吗?

而最重要的问题是:

为什么我的应用占用了这么多内存,如何减少高达60 MB的占用空间?

我真的很感激任何帮助!提前致谢!

编辑:在iPhone 4(A4)上测试后,我们发现应用程序在运行时不会崩溃,而在内存少于256 MB的设备上则会崩溃.

Sam*_*cer 6

我终于解决了这个问题.我花了几个小时思考为什么我的应用程序可能占用比Angry Birds或Doodle Jump更多的RAM.这只是没有意义,因为我的应用程序没有CALayer绘图,或复杂的Open GL图形渲染,或重型Web连接.

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

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

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

我还没有完成"粉碎"我的所有图像,但是当我这样做时,我会在最终的内存占用上更新每个人.

对于所有感兴趣的人,这里有一个博客的链接,解释如何安装PNGCrush(它相当复杂).

更新:而不是使用PNGCrush过程(这是非常有用的,虽然耗费大量图像)我现在使用一个名为ImageOptim的程序,它为多个脚本提供GUI,如PNGCrush.这是一个简短的描述:

ImageOptim无缝集成了各种优化工具:PNGOUT,AdvPNG,PNGCrush,扩展OptiPNG,JpegOptim,jpegrescan,jpegtran和Gifsicle.

这是一个链接到该网站,可以免费下载OS X 10.6 - 10.8.请注意,我不是此软件的开发人员,发布者或广告客户.