如何检测操作系统强制App关机

时间:2015-12-10 19:35:15

标签: ios objective-c memory-management

我正在为> = iOS8设备开发iOS应用程序。我的应用程序是内存密集型的,因为应用程序崩溃会成为问题。我有CrashLoggers,可以在下次启动时报告应用程序崩溃。但是,在某些情况下,应用程序可能会消耗高于通常的内存,并且操作系统可能会终止它。是否有任何代表可以用来检测操作系统强制终止应用程序?

我尝试[AppDelegate applicationWillTerminate:][AppDelegate applicationDidReceiveMemoryWarning:],但他们会在很大程度上给我误报。问题是这不是一个例外,而是OS提出的一个系统信号,用于杀死我试图在事件范围内检测到的应用程序。

我是一名新程序员。如果我理解错误或者我做出不切实际的假设,请告诉我。

我已阅读以下链接: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/applicationWillTerminate

Is there any method in appDelegate which is called when application crashes?

我明白预防这个问题比治疗好。但在这里,我试图检测是否会出现问题。它并不像应用程序总是崩溃。在iPhone 4s / iPad Air 1等非常老的设备上可能存在一些边缘情况或用户,应用程序可能会运行(可能)成问题。所以,我需要一个针对此的记录机制。

应用程序的运行时间大约为120MB,这种情况很高但是在太高的范围内。虽然该应用程序具有许多功能,但应用程序中的图像处理难以执行,同时保持质量并且还要在内存方面进行分析(峰值取决于大小,图像质量,照明等)。所以我的应用程序完全在边界线内,我想要检测应用程序在用户使用时是否越过此边界。

我完全同意您提供的优化(或修复崩溃)建议,我会尽力优化(或删除)应用程序。

2 个答案:

答案 0 :(得分:1)

当应用程序崩溃或被系统杀死时,没有任何信号表明您可以有意义地捕获。

是什么让你认为applicationDidReceiveMemoryWarning:会给你错误的警告?

接收内存警告然后不被杀不是误报。这只意味着你的应用程序没有增加内存分配到足以超过阈值。

当您收到内存警告时,请根据需要进行记录,但也会降低内存使用量

您如何知道最大运行时分配占用空间为120MB?根据设备的不同,您可以在现代设备上使用大约125MB(iPad 1)到1GB以上的内存(iPad Pro上更多)。

答案 1 :(得分:-3)

你应该得到你的applicationDidReceiveMemoryWarning:当系统处于内存压力时调用。这可以通过选择硬件菜单中的Simulate Memory Warning菜单项来模拟。

如果你实际上超过了设备的内存限制,你将获得jetsamed(SIGKILLed)。你无法检测到它。

如果您想模拟jetsam,只需向您的流程发送SIGKILL(kill -9 <pid>