当应用程序终止时,清除来自NSUserDefaults的数据

时间:2017-12-16 12:43:44

标签: ios objective-c nsuserdefaults

一旦我杀死了应用程序,那么我想清除NSUserDefaults中的数据,但有时它不会被清除。 我已将代码添加到此方法中:

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [[NSUserDefaults standardUserDefaults]removeObjectForKey:kcoupondic];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

4 个答案:

答案 0 :(得分:3)

如果您要清除应用终止时的值,为什么使用NSUserDefaults

使用全局变量而不是NSUserDefaults

OR

如果您不想删除所有NSUserDefaults,请尝试以下操作:

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

答案 1 :(得分:1)

并不总是调用

applicationWillTerminate 。这来自Apple的文档。

  

此方法可让您的应用知道它即将被终止并完全从内存中清除。您应该使用此方法为应用程序执行任何最终清理任务,例如释放共享资源,保存用户数据以及使计时器无效。您执行此方法大约需要五秒钟来执行任何任务并返回。如果该方法在时间到期之前没有返回,则系统可以完全终止该过程。   对于不支持后台执行或与iOS 3.x或更早版本链接的应用程序,当用户退出应用程序时,始终会调用此方法。对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,可以在应用程序在后台运行(未暂停)并且系统因某种原因需要终止它的情况下调用此方法。

要回答关于为何数据未被清除的问题,可能不会调用此方法。尝试并添加一些日志以检查方法是否被调用。

我宁愿将此代码放在AppDelegate中的 applicationDidFinishLaunchingWithOptions 中。在这种情况下,您确定在每次启动应用时,您都会在重新填充数据之前清除这些数据。

答案 2 :(得分:0)

对于Swift:

if let bundleId = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleId)
}

在这里,我们可以选择打开bundleIdentifier来防止崩溃。

答案 3 :(得分:-1)

尝试编写代码以清除applicationWillResignActive中的NSUserDefaults而不是applicationWillTerminate