什么时候调用applicationWillTerminate?

时间:2015-04-02 15:10:29

标签: ios objective-c

在什么情况下会调用applicationWillTerminate?例如,如果代码中发生崩溃,它是否会被调用?

Apple的文档对此很模糊,只是说系统需要因某种原因终止它。

  

适用于不支持后台执行或已关联的应用   对于iOS 3.x或更早版本,此方法始终在用户时调用   退出应用程序。对于支持后台执行的应用程序,此方法   通常不会在用户退出应用程序时调用,因为该应用程序   在这种情况下简单地移动到背景。但是,这种方法可能   在应用程序在后台运行的情况下调用   (未暂停)系统需要因某种原因终止它。

6 个答案:

答案 0 :(得分:36)

我刚刚探讨了这个问题(iOS 9.2)。我有一些结果。

因此,当用户终止应用而不将其切换到后台模式时,会调用applicationWillTerminate:应用处于活动状态,用户双击主页按钮并抛出应用。

但是,如果用户首先将应用切换到后台,然后在尝试终止应用后,则不会调用- (void)applicationWillTerminate:(UIApplication *)application { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"term"]; [[NSUserDefaults standardUserDefaults] synchronize]; }

您可以查看:

- (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;

 $memcache = new Memcached ( 'a_mem_pool' );
    $ss = $memcache->getServerList ();
    if (empty ( $ss )) {
        $memcache->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
        $memcache->setOption(Memcached::OPT_SEND_TIMEOUT, 1000);
        $memcache->setOption(Memcached::OPT_TCP_NODELAY, true);
        $memcache->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 50);
        $memcache->setOption(Memcached::OPT_CONNECT_TIMEOUT, 500);
        $memcache->setOption(Memcached::OPT_RETRY_TIMEOUT, 300);
        $memcache->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
        $memcache->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
        $memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
        $memcache->addServer ( 'localhost', 11211, 1 );
        $memcache->addServer ( 'server2.localhost', 8000, 1 );
    }

}

答案 1 :(得分:22)

从iOS 4开始,实际答案是“从不”。 (或至少“很少”。)你不能认为它会被召唤。通常情况下,当用户按下主页按钮时,您的应用程序会移动到后台,几秒钟后,它会切换到“挂起状态”(仍在内存中,但不会接收任何CPU时间。)

一旦您的应用程序处于暂停状态,系统可以随时终止它而不会发出警告(通常是由于内存压力。)

当你被停用时,你没有在被杀之前得到applicationWillTerminate。您应该假设当收到applicationDidEnterBackground:消息时,您将很快被暂停,并在暂停时死亡。按顺序获取您的事务(保存应用程序状态。)

在某些情况下,您仍然可以接到针对您的申请的电话终止,但您不应该认为您会这样做。

答案 2 :(得分:8)

根据App Programming Guide for iOS

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

答案 3 :(得分:2)

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

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

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

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

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

编辑:如果用户告诉应用程序切换器关闭应用程序,它也会尝试优雅地关闭您的应用程序。但如果是设备需要更多资源的情况,则有可能无法调用-applicationWillTerminate:,因为设备没有时间,因为它可能需要更快的资源,而不是您的应用可以被告知优雅地关闭。因此无法保证applicationWillTerminate:被调用。

答案 4 :(得分:0)

我认为当用户从前台杀死应用程序或操作系统自己执行时会调用它。剩下的时间它只是一个很大的"也许"。我通常不会依赖于那个"也许"。

您可以使用" didEnterBackground"以更可靠的方式调用

您还可以尝试有目的地创建崩溃,并查看它的确切反应(从前景和背景崩溃)。

答案 5 :(得分:0)

迅速在下面的

中使用委托
optional func applicationWillTerminate(_ application: UIApplication)
  

此方法使您的应用知道即将终止并完全从内存中清除。您应该使用此方法为您的应用执行所有最终清理任务,例如释放共享资源,保存用户数据和使计时器无效。此方法的实现大约需要五秒钟来执行任何任务并返回。如果该方法在时间到期之前没有返回,则系统可能会完全终止该进程。

ref:https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623111-applicationwillterminate