一旦我杀死应用程序,我就想清除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];
}
如果要在应用终止上清除值,为什么要使用NSUserDefaults
。
使用全局变量代替NSUserDefaults
或
如果您不删除所有NSUserDefaults
,请尝试以下操作:
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
applicationwillterminate 并不总是被调用。这是来自苹果的文档。
此方法使您的应用程序知道它将完全从内存中终止并清除。您应该使用此方法为应用程序执行任何最终的清理任务,例如释放共享资源,保存用户数据和无效的计时器。您对此方法的实现大约有五秒钟来执行任何任务并返回。如果该方法在时间到期之前未返回,则系统可能会完全杀死该过程。 对于不支持背景执行或针对iOS 3.x或更早链接的应用程序,当用户退出应用程序时,始终调用此方法。对于支持背景执行的应用程序,当用户退出应用程序时,通常不会调用此方法,因为该应用在该情况下仅移至背景。但是,在应用程序在后台运行(不暂停)的情况下,该方法可以称为该方法,并且由于某种原因,系统需要终止它。
要回答您的问题为什么未清除数据,也许没有调用此方法。尝试添加一些日志以检查该方法是否被调用。
我宁愿将此代码放入AppDelegate内部的 applicationdidfinishlaunchingwithoptions 。在这种情况下,您可以肯定的是,在每个应用程序启动下,都可以在重新填充数据之前清除此数据。
swift:
if let bundleId = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleId)
}
在这里,我们是可选的UNWRAP bundleIdentifier
,以防止崩溃。
尝试编写代码以在applicationWillResignActive
而不是applicationWillTerminate
中清除NSUSERDEFAULTS。