4

信息

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

问题

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

  • iPod 触摸 4G
  • iPhone 3GS
  • iPad 1

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

发现

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

  1. 没有内存泄漏(我使用的是 ARC),但有内存警告
  2. 项目正在疯狂地分配。分配的项目太多了,即使我使用的是 ARC,也好像 ARC 没有做它应该做的事情
  3. 由于我认为“过度分配”,结果是:

    此应用程序(平均)占用 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 的设备上它会崩溃。

4

1 回答 1

6

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

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

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

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

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

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

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

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

这是一个网站链接,可免费下载 OS X 10.6 - 10.8。请注意,我不是该软件的开发商、出版商或广告商。

于 2012-07-05T17:19:40.760 回答