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

时间:2012-07-04 15:15:24

标签: objective-c performance memory memory-management crash

信息

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

问题

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

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

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

调查结果

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

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

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

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

    代码和警告

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

    更多背景资料

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

    几个问题

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

    最重要的问题是:

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

  

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

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