识别IOS内存不足崩溃

13

我们的应用程序已经上线了应用商店。

我希望能够识别一些用户遇到的内存耗尽导致的崩溃。

我知道没有办法可以100%识别出内存耗尽导致的崩溃。

有没有办法通过在applicationDidReceiveMemoryWarning中执行一些逻辑来识别这些崩溃(有相当大的概率)?(我不是在谈论在xcode开发期间找到它,我是说代码将从实际用户中识别出内存耗尽导致的崩溃,并将其记录到文件中)


使用Instruments(cmd+I)来跟踪分配情况。 - Levi
虽然这只是一个技术问题:由于内存不足而终止您的应用程序并不真正意味着“崩溃”(尽管对于用户来说看起来像)。 - occulus
一般来说不会。但是,内存不足的最可能原因是UIImage的不当使用,导致太多的图像同时被保存在内存中。另一个非常可能的原因是ViewController中的引用计数循环,这些引用计数循环以一种导致循环的方式引用其他视图控制器。问题是,这些问题通常只会在产品发布后,在最终用户设备上运行时才会出现。只有非常谨慎的开发过程和代码审查才能防止这种问题的发生。 - MoDJ
3个回答

8

当我在寻找任何提供OOM跟踪的服务或库时,我只能找到Facebook工程团队的这篇文章:

https://code.facebook.com/posts/1146930688654547/reducing-fooms-in-the-facebook-ios-app/

这个想法是推断应用程序需要启动的原因,检查不同的方面(比如应用程序是否在后台运行,是否有应用程序/操作系统更新等)。
排除所有可能导致先前应用程序退出的其他原因,你可以知道原因是后台内存不足还是前台内存不足。
有一个实现 Facebook 文章过程的库会很好。但是现在我找不到任何一个,可能有一些困难或不可能将其添加为 sdk。
如果有人知道任何服务,请通过评论或新答案与大家分享。
编辑:
我发现了这个 github(https://github.com/jflinter/JRFMemoryNoodler),其中包含 Facebook 帖子过程的实现。我还没有尝试过,但我们将在我们的应用程序中部署它以尝试它。

你最后尝试了吗?有成功吗? - Johanisma
1
@Johanisma,我们原本打算使用这个库(JRFMemoryNoodler)来部署我们的应用程序,但就在构建即将完成之前,我们决定将其移除。因为在开发过程中,当我们强制使应用程序崩溃时,我们不确定这个工具是否能帮助我们检测不同的OOM(也许我们没有正确解释崩溃或它没有正常工作)。如果你找到了什么,请分享一下,因为我们仍然遇到OOM问题。 - Néstor

-1

在你的应用程序委托中注意 applicationWillTerminate 消息。如果你的应用程序由于低内存等原因被系统终止,就会调用这个方法,但如果用户按 home 键通常方式离开应用程序,则不会调用此方法。注意:如果你的应用程序在后台运行且内存不足,你的应用程序将被杀死,而不会发送任何消息。

特别是对于旧版本的 iOS,可能会有所不同,值得研究以确保上述内容准确无误。

这篇博客文章 中的图片非常有信息量(尽管有点过时)。

更多信息,请参见 如何知道应用程序是由用户还是 iOS 终止的(在 10 分钟后的后台)


2
每当应用程序因内存不足而被终止(在前台运行时),都会发生applicationWillTerminate吗?此外,当用户完全关闭应用程序(而不是将其移至后台)时,它是否也会被调用? - AJ222

-5
首先,通过在Xcode的顶部菜单栏上单击产品并单击分析部分来分析您的应用程序,它将显示应用程序中泄漏的数量,并可以带您到泄漏发生的地方。这就是如何找到内存泄漏并纠正它的方法。 其次,如果以上方法不起作用,请查看崩溃发生的视图控制器,并检查是否有任何需要释放的对象。 希望这可以帮助您解决问题。

2
你回答了一个与问题不同的问题。他在帖子中甚至说:“我不是在谈论在开发期间在Xcode中找到它”。 - occulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接