信息
我最近在 AppStore 上推出了一款应用。在模拟器上测试了数千次,实际设备测试了数百次之后,我们终于发布了我们的应用程序。
问题
当用户启动应用程序时,开始弹出有关应用程序崩溃的评论。我们认为应用程序在 RAM 小于(或等于)256 Mb 的 iOS 设备上启动时会崩溃。以下设备是我们的应用支持的少于 256 个的设备:
- iPod 触摸 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 的设备上它会崩溃。