什么时候调用applicationWillTerminate?

Boo*_*oon 25 objective-c ios

在什么情况下会调用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,但您不应该认为您会这样做.

  • 在使用Sim的iOS 9.1上,诀窍是从应用程序内部两次激活主页快捷方式,然后从多任务处理中终止.家里再回家两次不会开火. (3认同)
  • 这个答案是正确的,但为了完整起见,最好强调暂停和背景之间的区别.当您的应用程序在info.plist中具有特定的背景模式时,背景是打算的,这使得应用程序在按下主页按钮后也运行,在所有其他情况下,应用程序进入暂停状态,并且此方法永远不会被调用(并且据我所知,即使用户杀死应用程序). (2认同)

jk7*_*jk7 9

根据适用于iOS应用程序编程指南应用程序终止:

  • 应用程序必须随时准备好终止,并且不应等待保存用户数据或执行其他关键任务.
  • 系统启动的终止是应用程序生命周期的正常部分.系统通常终止应用程序,以便它可以回收内存并为用户启动的其他应用程序腾出空间,但系统也可以终止行为不端或未及时响应事件的应用程序.
  • 暂停的应用程序在终止时不会收到通知; 系统终止进程并回收相应的内存.
  • 如果某个应用当前正在后台运行且未暂停,则系统会在终止之前调用其应用委托的applicationWillTerminate : .
  • 设备重新启动时,系统不会调用此方法.
  • 除了终止您的应用程序的系统之外,用户还可以使用多任务UI显式终止您的应用程序.用户启动的终止与终止暂停的应用程序具有相同的效果.该应用程序的进程被终止,并且没有向该应用程序发送通知.


Kyl*_*lls 6

当用户打开应用程序然后按下主页按钮时,iOS 不会关闭应用程序,而是将其挂起并将其置于后台。

但是,iOS 设备只有 1GB 的内存(大部分),因此在打开和关闭一些应用程序后,它们开始耗尽。

iOS 现在必须从 ram 中删除其中一些应用程序。所以它唤醒(猜测最大的 ram 用户,或最旧的使用应用程序)一个应用程序,并告诉它保存任何它需要优雅地关闭。

那个时候-applicationWillTerminate:叫。当 iOS 关闭您的应用程序时。当然,如果您阻止该方法返回太长时间,iOS 无论如何都会杀死您的应用程序(毕竟它需要资源)。

如果您正在保存所有内容-willResignActive:-willEnterBackground:那么您几乎可以忽略该方法,并且您的应用程序将在该方法返回后关闭。

编辑:如果用户告诉应用程序切换器关闭应用程序,它也会尝试正常关闭您的应用程序。但是,如果设备需要更多资源,则您可能不会被-applicationWillTerminate:调用,因为设备没有时间调用资源,因为它可能需要资源的速度比您的应用程序被告知正常关闭的速度要快。所以applicationWillTerminate:不能保证被调用。

  • 不,如果您的应用程序已经在后台,强制退出它不会生成 applicationWillTerminate 消息。 (5认同)