Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么时候将调用ApplicationTerminate?_Ios_Objective C - Fatal编程技术网

Ios 什么时候将调用ApplicationTerminate?

Ios 什么时候将调用ApplicationTerminate?,ios,objective-c,Ios,Objective C,在什么情况下将调用ApplicationTerminate?例如,如果代码中出现崩溃,是否会局部调用它 苹果的文档对此含糊其辞,它只在系统出于某种原因需要终止时才说 对于不支持后台执行或链接的应用程序 对于iOS 3.x或更早版本,当用户 退出应用程序。对于支持后台执行的应用程序,此方法 通常在用户退出应用程序时不会调用,因为应用程序 在这种情况下,只需移动到背景。然而,这种方法可能会 在应用程序在后台运行的情况下调用 (未暂停)并且系统需要出于某种原因终止它 当用户打开应用程序,然后按下hom

在什么情况下将调用ApplicationTerminate?例如,如果代码中出现崩溃,是否会局部调用它

苹果的文档对此含糊其辞,它只在系统出于某种原因需要终止时才说

对于不支持后台执行或链接的应用程序 对于iOS 3.x或更早版本,当用户 退出应用程序。对于支持后台执行的应用程序,此方法 通常在用户退出应用程序时不会调用,因为应用程序 在这种情况下,只需移动到背景。然而,这种方法可能会 在应用程序在后台运行的情况下调用 (未暂停)并且系统需要出于某种原因终止它


当用户打开应用程序,然后按下home按钮时,iOS不会关闭应用程序,而是将其挂起并放在后台

然而,iOS设备只有1GB内存(大部分),所以在打开和关闭一些应用程序之后,它们的内存就开始耗尽

iOS现在必须将其中一些应用程序从ram中踢出。因此,它会唤醒一个应用程序(猜测最大的ram用户,或使用最久的应用程序),并告诉它保存所有需要关闭的应用程序

此时将调用
-applicationWillTerminate:
。当iOS关闭你的应用程序时。当然,如果你阻止该方法返回太长时间,iOS将终止你的应用程序(毕竟它需要更多的资源)

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


编辑:如果用户告诉应用程序切换器关闭应用程序,它也会尝试优雅地关闭你的应用程序。但是,如果设备需要更多资源,则有可能无法调用
-应用程序将终止:
,因为设备没有时间调用,因为它需要资源的速度可能快于通知您的应用程序正常关闭的速度。因此,
应用程序将终止:
不保证被调用。

我认为当用户从前台杀死应用程序或操作系统自己杀死应用程序时,它将被调用。剩下的时间只是一个很大的“可能”。我通常不会因为那个“也许”而依赖它

您可以使用“dienterbackground”,它以更可靠的方式调用


您还可以尝试故意创建一个崩溃,看看它的反应如何(前台和后台崩溃)。

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

一旦你的应用程序处于暂停状态,系统可以在没有警告的情况下随时终止它(通常是由于内存压力)

当您被挂起时,您不会收到应用程序将在被终止之前终止的调用。您应该假设,当您收到一条
applicationidenterdbackground:
消息时,您将很快被挂起,并在挂起时死亡。整理您的事务(保存应用程序状态。)


在某些情况下,您可能仍会收到对应用程序的调用,但您不应假设您会终止。根据以下条件,应用程序终止:

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

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

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

但是如果用户首先将应用程序切换到后台,然后尝试终止应用程序,
applicationWillTerminate
将不会被调用

您可以检查以下内容:

- (void)applicationWillTerminate:(UIApplication *)application {
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"term"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}


}

在swift中,使用下面的委托

optional func applicationWillTerminate(_ application: UIApplication)
这个方法让你的应用程序知道它将被终止并从内存中完全清除。您应该使用此方法为应用程序执行任何最终清理任务,例如释放共享资源、保存用户数据和使计时器无效。此方法的实现大约有五秒钟的时间来执行任何任务并返回。如果该方法在时间到期之前未返回,系统可能会完全终止该进程


ref:

如果您强制退出应用程序,应用程序是否会终止?我不确定。试试看。这个答案是正确的,但为了完整起见,最好强调挂起和背景之间的区别。当您的应用程序具有特定背景时,使用背景
optional func applicationWillTerminate(_ application: UIApplication)