当应用程序杀死时,请清除NsuserDefault的数据



一旦我杀死应用程序,我就想清除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。

最新更新