【问题标题】:delete files in documents folder when iphone app terminatediphone应用程序终止时删除文档文件夹中的文件
【发布时间】:2012-12-24 09:46:53
【问题描述】:

我的 iPhone 应用程序将在运行应用程序时将多个内容下载到 Documents 文件夹。我想在应用程序终止时删除下载的文件。我的应用程序在目标 4.3 或更高版本上运行并启用了 ARC。从文档文件夹中删除内容的最佳位置是什么?

- (void)applicationWillTerminate:(UIApplication *)application

应用程序终止时不会被调用。

【问题讨论】:

  • "applicationWillTerminate 在应用程序终止时不会被调用" - 好吧,它调用了,至少你的应用程序没有终止,只是暂停。
  • 来自documentation对于支持后台执行的应用程序,在用户退出应用程序时一般不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,此方法可能会在应用程序在后台运行(未挂起)并且系统出于某种原因需要终止它的情况下调用
  • 请注意,他们使用了 “may be”。所以不能保证它会被调用。

标签: ios ipad automatic-ref-counting uiapplicationdelegate uiapplication


【解决方案1】:

寻找– applicationDidEnterBackground: 而不是applicationWillTerminate

在 iOS 4.0 及更高版本中,当用户退出支持后台执行的应用程序时,将调用此方法而不是 applicationWillTerminate: 方法。

applicationWillTerminate 代表在 iOS4 之前的世界中“退出”应用程序的含义。

在现代(即 iOS4+)应用程序中,当用户退出应用程序时,应用程序会进入后台并暂停(因此用户可以快速重新进入)。因此,应用程序实际上并没有终止,如果需要恢复内存,iOS 仍然可以随时终止它。这种情况经常发生,这意味着如果您暂停您的应用程序并在第二天返回它,您会发现该应用程序已终止。糟糕的是,暂停的应用程序在终止时不会收到applicationWillTerminate 消息,因此applicationDidEnterBackground: 是您在用户退出后必须自行清理的最后一个“保证”机会应用程序。

无论如何,如果您在应用 plist 文件中设置 UIApplicationExitsOnSuspend,您仍然可以在用户退出您的应用(并且您的应用相应终止)时调用 applicationWillTerminate

为了完整起见,我还要加上applicationWillTerminate

可能在应用程序在后台运行(未挂起)并且系统出于某种原因需要终止它的情况下调用。

但这是实际在后台运行的应用程序的特定用例(这是计算数量的应用程序类型的情况)。

总结一下,清理文档的正确位置是:

  1. applicationDidEnterBackground 如果您运行的是 iOS4+ 并且不要在您的应用 plist 文件中设置 UIApplicationExitsOnSuspend

  2. applicationWillTerminate 如果您在 iOS3 上运行在您的应用 plist 文件中设置 UIApplicationExitsOnSuspend

【讨论】:

  • applicationDidEnterBackground: 将在应用程序进入后台模式时调用,而不是在应用程序终止时调用,除非在 info.plist 文件中将 UIApplicationExitsOnSuspend 设置为 YES。所以它不是applicationWillTerminate的替代品。
  • @ACB:感谢您的评论。我指的是 Apple UIApplicationDelegate 协议参考关于applicationDidEnterBackground 的内容。在许多情况下(几乎总是,除了后台运行的应用程序)进入后台非常接近被终止,因为您的应用程序可以在暂停时随时终止,而不会收到任何通知。无论如何,为了完整性,我扩展了我的答案。
  • @Sivannarayana,由您决定将其保存在哪里。如果您想在用户最小化应用程序(进入后台模式)时清理它,您可以在applicationDidEnterBackground 方法中进行。但是,只要用户只是切换应用程序,这就会清除它。但是,如果您在 applicationWillTerminate 中执行此操作,则无法保证在终止时会调用 applicationWillTerminate
  • @sergio,如果一个应用程序进入后台,它被终止只是时间问题。我不确定你的意思是什么,但我现在有很多应用程序在后台模式下保存了几个月,我根本没有看到它们被终止。它只是从我离开的地方开始。因此,我不同意该评论。我觉得终止应用程序和暂停应用程序之间有明显的区别。
  • @sergio,是的,我同意。但那里总有一个“如果”。 90% 的场景,只要进入后台模式,它就不会被终止。您的评论让我们觉得应用程序在进入后台模式后会立即终止,这是不正确的。只有满足您上面提到的标准,它才有可能被终止。否则,在正常情况下,如果您尝试将其置于前台,它应该可以正常工作。
【解决方案2】:

因为如果您在 iOS 4+ 上运行(并且应用程序在进入后台时不会强制退出),您将不会收到 applicationWillTerminate:,如果您真的希望仅在应用程序终止时清理这些东西,您应该这样做在applicaitonDidFinishedLaunching:

【讨论】:

  • 您的回答具有误导性。 applicaitonDidFinishedLaunching 在应用启动时调用,而不是在终止时调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2017-12-17
  • 2012-11-20
  • 2011-04-13
相关资源
最近更新 更多