applicationWillTerminate在崩溃时被调用

时间:2011-08-17 21:05:07

标签: iphone objective-c xcode

我有一个应用程序需要知道崩溃的时间(用于调试目的)。当应用程序关闭时,它会在委托中调用- (void)applicationWillTerminate:(UIApplication *)application

根据我的理解,它不应该在应用程序崩溃时调用该行,但出于某种原因它会这样做。 (如果应用程序DID没有崩溃,我有代码在NSUserDefaults设置一个值,但如果DID崩溃则不会改变它。)

一些细节:调用- (void)applicationDidBecomeActive:(UIApplication *)application时,程序中的NSUserDefaults键设置为YES。调用- (void)applicationWillTerminate:(UIApplication *)application时,同一个键设置为NO。下次启动时,应用程序将检查相同的密钥是否设置为YES或NO。计划是检查密钥是否为是,如果是,则表示它没有正确关闭(即崩溃)。

我应该使用什么来检查它是否崩溃?

1 个答案:

答案 0 :(得分:5)

您的问题是写入NSUserDefaults并不一定会将该值同步到磁盘。通常,NSUserDefaults会每隔30秒左右将更改同步到磁盘。发生了什么事情是您在YES中存储NSUserDefaults,然后在同步到磁盘之前崩溃,因此在下次启动时它会再次返回NO。此处的修复是在存储-[NSUserDefaults synchronize]值后调用YES以强制立即执行磁盘同步。

注意,由于-synchronize相对昂贵,所以只有在绝对需要确保将值立即写入磁盘时才应使用它。您描述的案例符合条件。很少有其他案例。