objective-c - NSUserDefaults 写在 -applicationWillTerminate : do not take effect; Why?

标签 objective-c ios xcode nsuserdefaults

我已将下面的代码放入我的 AppDelegate 中,但是当我再次启动应用程序时,我注意到值仍然保存(非 NULL)。这是为什么?

代码:

    - (void)applicationWillTerminate:(UIApplication *)application
{       [[NSUserDefaults standardUserDefaults]
         setObject:NULL forKey:@"roomCat"];
        [[NSUserDefaults standardUserDefaults]
         setObject:NULL forKey:@"TFA"];
        [[NSUserDefaults standardUserDefaults]
        setObject:NULL forKey:@"comments"];

}

谢谢。

最佳答案

您应该使用 -removeObjectForKey: 而不是设置 NULL。前者是删除值的官方方式,而后者是未记录的行为。

在任何情况下,如果使用 -removeObjectForKey: 不起作用,那么您可以添加一个调用

[[NSUserDefaults standardUserDefaults] synchronize];

最后。但只有在没有它不起作用的情况下才这样做。原因是因为调用 -synchronize 是(相对)昂贵的,所以只有在需要确保正确性时才应该这样做。


再看一眼,我怀疑您的真正问题是根本没有调用此方法。在 iOS 4 及更高版本上,当应用程序进入后台时,它们不会调用此方法,而是调用 -applicationDidEnterBackground:。您应该尝试将此代码放在那里。

关于objective-c - NSUserDefaults 写在 -applicationWillTerminate : do not take effect; Why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901020/

相关文章:

iphone - XCode 和 Archive 有问题..不知道它可能是什么

ios - 将用户名和密码保存在钥匙串(keychain)中并将其用作自动填充

ios - 推迟来自 App Store 的促销 IAP 请求时显示提醒

objective-c - Cocoa:区分输入设备/scrollWheel:作为鼠标滚轮和触控板

ios - 从iOS中的C函数内部生成带有Swift入口点的生成线程

objective-c - IOS:两个具有两种不同委托(delegate)方法的 UIAlert

iphone - 如何检测 iPhone 5(宽屏设备)?

iphone - cocos2d错误: No such file or directory

ios - 错误域=NSCocoaErrorDomain 代码=3840 "Invalid value around character 1."UserInfo={NSDebugDescription=字符 1 周围的值无效。swift 4

ios - 将 iPhone 应用程序与 iPad 应用程序连接