我最近在AppStore上推出了一款应用。经过数千次模拟器测试,实际设备数百次,我们终于发布了我们的应用程序。
当用户启动应用时,评论开始出现应用崩溃。我们认为应用程序在iOS设备上启动时崩溃,其内存小于(或等于)256 Mb 。以下设备是我们的应用程序支持的设备,小于256:
该应用并不总是崩溃。有时它发射很好并且运行顺畅。其他时候它崩溃了。从启动(当用户点击图标)到崩溃的时间通常是两秒钟,这意味着系统没有关闭它。
使用Instruments在某些设备上进行测试时,我发现以下内容:
由于我所谓的“过度分配”,结果是:
此应用程序(平均)需要60 MB的实内存和166 MB的虚拟内存。当应用程序启动时,正在使用的内存会快速增加,直到达到大约60 MB,此时视图已加载。 以下是仪器中活动监视器的快照:
我知道这些数字很高(尽管CPU%从未真正达到过)。我担心ARC工作不正常,或者更可能的情况:我没有正确分配对象。 可能发生什么?
在Xcode中,只有少数警告,这些警告都不属于应用程序启动或与启动应用程序相关的任何文件。我在App Delegate和我的viewDidLoad
方法中都设置了断点,以检查崩溃是否发生在那里 - 但事实并非如此。
此外,Xcode从不在调试器中生成任何错误或消息。 iTunes Connect中也没有崩溃报告,它只是说,“提交报告的报告太少了。”我已经向我的应用添加了崩溃报告,但我还没有发布该版本。
我开始使用Obj-C就像ARC到了,所以我刚开始处理内存,分配等等(这可能是显而易见的)但我想知道一些事情:
如何使用@autoreleasepool
来减少对内存的影响?我怎么处理内存警告,因为我使用ARC,我在didRecieveMemoryWarning
写什么?
删除NSLog语句有助于加快速度吗?
最重要的问题是:
为什么我的应用占用了这么多内存?如何减少高达60 MB的占用空间?
我真的很感激任何帮助!提前谢谢!
编辑:在iPhone 4(A4)上测试后,我们发现应用程序在运行时不会崩溃,而在内存少于256 MB的设备上则会崩溃。
答案 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。请注意,我不是此软件的开发人员,发布商或广告客户。