【问题标题】:What part of the App Delegate life-cycle is called when an app in the foreground has an out of memory crash?当前台应用发生内存不足崩溃时,调用 App Delegate 生命周期的哪一部分?
【发布时间】:2018-07-27 14:03:58
【问题描述】:

尝试调试用户遇到的未显示在我们的崩溃报告工具或日志文件中的崩溃。有一种理论可能是由于内存压力,但不确定如果 iOS 在前台杀死应用程序应用程序是否会调用 applicationWillTerminate。我们在applicationWillTerminate 中写入我们的日志文件,但在这次崩溃期间它显然没有被调用。

【问题讨论】:

    标签: ios iphone swift memory-management memory-leaks


    【解决方案1】:

    如果应用崩溃,则不会可靠地调用生命周期方法。相反,您可以创建并注册一个在这种情况下被调用的全局异常处理程序:

    func exceptionHandler(exception: NSException) {
      print("*** UNHANDLED EXCEPTION ***")
      print(exception)
      print("CALL STACK:")
      print(exception.callStackSymbols.joined(separator: "\n"))
    }
    

    使用NSSetUncaughtExceptionHandler注册这个函数,例如在你的UIApplicationDelegate.application:didFinishLaunchingWithOptions::

    NSSetUncaughtExceptionHandler(exceptionHandler)
    

    【讨论】:

    • 您可以在调试器中设置异常断点,结果相同,无需任何代码行。 (导航中的断点选项卡,+ 按钮引脚情人左角),虽然它不是银弹,通常你不能从这些异常中得到任何合适的结果。
    • '当然可以。但是删除这几行会将每个未处理的异常打印到控制台(或日志系统,因此也将其持久化),这通常是我想要作为进一步分析步骤的起点。
    • 使用这段代码,我在`NSSetUncaughtExceptionHandler(exceptionHandler)`行得到A C function pointer can only be formed from a reference to a 'func' or a literal closure
    • 您必须将其定义为全局函数,而不是成员方法。
    • 或者,如错误消息所示,您也可以直接传入闭包:NSSetUncaughtExceptionHandler({ print($0) })
    【解决方案2】:

    系统必须触发 applicationWillTerminate 才能杀死应用程序。但是,您无法确定在 app 实际被杀死之前需要多少时间。也许只是没有足够的时间来写日志。在因内存消耗而杀死应用程序之前,系统应发送内存警告。您可以通过在模拟器上模拟内存警告来测试最后一个。如果applicationWillTerminate 没有被调用,那么想要被系统终止并且你崩溃与内存消耗没有直接关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多