我有一个应用程序需要知道崩溃的时间(用于调试目的)。当应用程序关闭时,它会在委托中调用- (void)applicationWillTerminate:(UIApplication *)application
。
根据我的理解,它不应该在应用程序崩溃时调用该行,但出于某种原因它会这样做。 (如果应用程序DID没有崩溃,我有代码在NSUserDefaults
设置一个值,但如果DID崩溃则不会改变它。)
一些细节:调用- (void)applicationDidBecomeActive:(UIApplication *)application
时,程序中的NSUserDefaults
键设置为YES。调用- (void)applicationWillTerminate:(UIApplication *)application
时,同一个键设置为NO。下次启动时,应用程序将检查相同的密钥是否设置为YES或NO。计划是检查密钥是否为是,如果是,则表示它没有正确关闭(即崩溃)。
我应该使用什么来检查它是否崩溃?
答案 0 :(得分:5)
您的问题是写入NSUserDefaults
并不一定会将该值同步到磁盘。通常,NSUserDefaults
会每隔30秒左右将更改同步到磁盘。发生了什么事情是您在YES
中存储NSUserDefaults
,然后在同步到磁盘之前崩溃,因此在下次启动时它会再次返回NO
。此处的修复是在存储-[NSUserDefaults synchronize]
值后调用YES
以强制立即执行磁盘同步。
注意,由于-synchronize
相对昂贵,所以只有在绝对需要确保将值立即写入磁盘时才应使用它。您描述的案例符合条件。很少有其他案例。