【发布时间】:2012-07-05 02:46:14
【问题描述】:
信息
我最近在 AppStore 上推出了一款应用。在模拟器上测试了数千次,在实际设备上测试了数百次后,我们终于发布了我们的应用程序。
问题
当用户启动应用程序时,开始弹出有关应用程序崩溃的评论。我们发现应用在 RAM 小于(或等于)256 Mb 的 iOS 设备上启动时会崩溃。以下设备是我们的应用支持的设备,数量少于 256:
- iPod Touch 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 的设备上却会。
【问题讨论】:
-
您没有从设备访问崩溃日志吗?
-
@sergio 在 iTunesConnect 中没有崩溃日志:“提交的报告很少”
-
正是由于这些原因,将崩溃报告器添加到您的应用程序中确实很有帮助。我的经验:zx81.org.uk/computing/opinion/…
-
@StephenDarlington 那么除了尝试猜测问题之外我无能为力吗(直到我与崩溃报告者一起更新)?
-
@RazorSharp 知道 何时 它崩溃足以让我在某些情况下找出问题所在。但如果你不能,我不确定除了购买基于 A4 的设备之外你还能做些什么。
标签: objective-c performance memory memory-management crash