iphone应用程序终止时删除文档文件夹中的文件

Posted

技术标签:

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

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

- (void)applicationWillTerminate:(UIApplication *)application

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

【问题讨论】:

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

寻找– applicationDidEnterBackground: 而不是applicationWillTerminate

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

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

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

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

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

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

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

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

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

    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 在应用启动时调用,而不是在终止时调用。

以上是关于iphone应用程序终止时删除文档文件夹中的文件的主要内容,如果未能解决你的问题,请参考以下文章

将文件夹从主包复制到 iphone 中的文档目录

无法从 iPhone 文档目录位置中的已保存文件重新加载 UIImage

iPhone 上的应用程序文档文件夹

创建文档文件夹 iPhone SDK

iphone中的异常抛出JSON支持程序

centosc程序异常终止