在什么情况下会调用applicationWillTerminate?例如,如果代码中出现崩溃,它是否会被调用?
Apple的文档对此很模糊,只是说系统需要因某种原因需要终止它.
对于不支持后台执行或与iOS 3.x或更早版本链接的应用程序,当用户退出应用程序时,始终会调用此方法.对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台.但是,可以在应用程序在后台运行(未暂停)并且系统由于某种原因需要终止它的情况下调用此方法.
Ale*_*lex 42
我刚刚探讨了这个问题(iOS 9.2).我有一些结果.
因此,applicationWillTerminate当用户终止应用程序而不将其切换到后台模式时调用:应用程序处于活动状态,用户双击主页按钮并抛出应用程序.
但是,如果用户首先将应用程序切换到后台,然后在尝试终止应用程序之后,applicationWillTerminate将不会被调用.
你可以检查一下:
- (void)applicationWillTerminate:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"term"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Run Code Online (Sandbox Code Playgroud)
和
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"term"]){
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"term"];
[[NSUserDefaults standardUserDefaults] synchronize];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"WORKED" message:@"term works" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
}
...
return YES;
Run Code Online (Sandbox Code Playgroud)
}
Dun*_*n C 25
从iOS 4开始,实际答案是"从不".你不能假设它会被调用.通常情况下,当用户按下主页按钮时,您的应用程序会移动到后台,然后几秒钟后它会切换到"暂停状态"(仍在内存中,但不会接收任何CPU时间.)
一旦您的应用处于暂停状态,系统可以随时终止它而不发出警告(通常是由于内存压力).
当您被暂停时,您在被杀之前不会获得applicationWillTerminate调用.您应该假设当您收到applicationDidEnterBackground:消息时,您将很快被暂停,并在暂停时死亡.按顺序获取您的事务(保存应用程序状态.)
在某些情况下,您仍然可以调用您的applicationWillTerminate,但您不应该认为您会这样做.
当用户打开应用程序然后按下主页按钮时,iOS 不会关闭应用程序,而是将其挂起并将其置于后台。
但是,iOS 设备只有 1GB 的内存(大部分),因此在打开和关闭一些应用程序后,它们开始耗尽。
iOS 现在必须从 ram 中删除其中一些应用程序。所以它唤醒(猜测最大的 ram 用户,或最旧的使用应用程序)一个应用程序,并告诉它保存任何它需要优雅地关闭。
那个时候-applicationWillTerminate:叫。当 iOS 关闭您的应用程序时。当然,如果您阻止该方法返回太长时间,iOS 无论如何都会杀死您的应用程序(毕竟它需要资源)。
如果您正在保存所有内容-willResignActive:,-willEnterBackground:那么您几乎可以忽略该方法,并且您的应用程序将在该方法返回后关闭。
编辑:如果用户告诉应用程序切换器关闭应用程序,它也会尝试正常关闭您的应用程序。但是,如果设备需要更多资源,则您可能不会被-applicationWillTerminate:调用,因为设备没有时间调用资源,因为它可能需要资源的速度比您的应用程序被告知正常关闭的速度要快。所以applicationWillTerminate:不能保证被调用。