写在-applicationWillTerminate中的NSUserDefaults:不生效;为什么?

时间:2012-01-17 20:07:46

标签: objective-c ios xcode nsuserdefaults

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

代码:

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

}

谢谢。

4 个答案:

答案 0 :(得分:9)

您应该使用-removeObjectForKey:而不是设置NULL。前者是消除价值观的官方方式,而后者则是无证件行为。

在任何情况下,如果使用-removeObjectForKey:不起作用,则可以添加对

的调用
[[NSUserDefaults standardUserDefaults] synchronize];

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


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

答案 1 :(得分:3)

在这种情况下,我希望您需要手动调用NSUserDefaults上的synchronize方法作为此方法的最后一行,以确保在应用程序终止之前进行同步。

答案 2 :(得分:0)

尝试使用此方法:

- (void)removeObjectForKey:(NSString *)defaultName

答案 3 :(得分:0)

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


 if (prefs) 
{

    [prefs setObject:NULL forKey:@"roomCat"];
    [prefs synchronize];
}