【问题标题】:How to detect an OS forced App Shutdown如何检测操作系统强制关闭应用程序
【发布时间】:2016-03-16 13:59:50
【问题描述】:

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

我尝试了[AppDelegate applicationWillTerminate:][AppDelegate applicationDidReceiveMemoryWarning:],但它们大部分都会给我误报。问题是这不是例外,而是操作系统发出的系统信号,用于终止我试图在事件范围内检测到的应用程序。

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

我已阅读以下链接: 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,虽然很高,但远低于过高的范围。虽然该应用程序具有许多功能,但应用程序中的图像处理难以在保持质量的同时执行,并且还难以根据内存进行配置(峰值取决于大小、图像质量、照明等)。所以我的应用程序完全在边界线内,我正在寻求方法来检测用户使用时应用程序是否跨越了这个边界。

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

【问题讨论】:

  • "我的应用程序占用大量内存,这成为一个问题,因为应用程序可能会崩溃" - 什么?一个应用程序应该永远崩溃 - 我个人希望你不能对它做出反应,修复你的代码,不要对崩溃做出反应,修复导致崩溃的代码。您使用了多少内存,更重要的是 - 为什么
  • 我无法将我的问题与上述帖子联系起来。两者都是非常不同的问题。

标签: ios objective-c memory-management


【解决方案1】:

当应用程序崩溃或被系统杀死时,没有你可以有意义地捕捉到的信号。

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


收到内存警告然后没有被杀死不是误报。这只是意味着您的应用没有增加足够的内存分配来超过阈值。

当您收到内存警告时,如果需要,请记录,但也会减少内存使用量

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

【讨论】:

  • 它会发出警告,我正在寻找一种方法来检测我可以在某处记录的完全硬崩溃。我的应用程序有可能被警告但仍然存在。这将是误报
【解决方案2】:

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

如果您确实超出了设备上的内存限制,您将被 jetsamed (SIGKILLed)。你无法检测到这一点。

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

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2014-06-20
    • 2014-02-05
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多