在什么情况下会调用applicationWillTerminate?例如,如果代码中发生崩溃,它是否会被调用?
Apple的文档对此很模糊,只是说系统需要因某种原因终止它。
适用于不支持后台执行或已关联的应用 对于iOS 3.x或更早版本,此方法始终在用户时调用 退出应用程序。对于支持后台执行的应用程序,此方法 通常不会在用户退出应用程序时调用,因为该应用程序 在这种情况下简单地移动到背景。但是,这种方法可能 在应用程序在后台运行的情况下调用 (未暂停)系统需要因某种原因终止它。
答案 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:
终止应用程序答案 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)
此方法使您的应用知道即将终止并完全从内存中清除。您应该使用此方法为您的应用执行所有最终清理任务,例如释放共享资源,保存用户数据和使计时器无效。此方法的实现大约需要五秒钟来执行任何任务并返回。如果该方法在时间到期之前没有返回,则系统可能会完全终止该进程。