如果我使用“registerDefaults”来注册默认值,我无法删除我注册的默认值

时间:2012-12-17 09:39:20

标签: objective-c nsuserdefaults

NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@"content", @"myKey", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"myKey"]);

记录:

2012-12-17 17:09:05.062 browserHD[4075:c07] content 

为什么结果值“内容”?我想要结果值“nil”。

2 个答案:

答案 0 :(得分:2)

是的,你是对的......

这可能不是完美的解决方案。但需要进行一些调整才能解决问题。

如果你使用这种方式它可以工作!!!

- (IBAction)set:(id)sender {
    NSMutableDictionary *aDict=[NSMutableDictionary new];
    [aDict setObject:_myText.stringValue forKey:@"key"];

    [[NSUserDefaults standardUserDefaults] registerDefaults:aDict];
}

- (IBAction)remove:(id)sender {
    NSMutableDictionary *aDict=[NSMutableDictionary new];
    [aDict setObject:@"null" forKey:@"key"];
    [[NSUserDefaults standardUserDefaults] registerDefaults:aDict];
}

- (IBAction)get:(id)sender {
    NSLog(@"-> %@",[[NSUserDefaults standardUserDefaults]objectForKey:@"key"]);
}

答案 1 :(得分:0)

registerDefaults影响用户默认值的不同“级别”,而不是setObject:forKey:或removeObjectForKey。它进入全局用户默认值,这是一个高于标准用户默认值的级别。 “全球”是一个误称,因为它仍然是你的应用程序的本地。

使用此方法无法从全局用户默认值中删除值。

Global Defaults (NSGlobalDomain) -> User Defaults (NSRegistrationDomain)

如果值在用户值中,则它将覆盖全局值。如果不是,则采用全局默认值。添加和删​​除值仅影响用户默认值级别。

显然你无法摆脱全局默认值,因为如果删除用户默认值,全局默认值将永远“闪耀”。但是您可以将要“替换为nil”的对象值设置为[NSNull null]。然后在您的代码中,您将检查这种情况:默认值为nil或[NSNull null],它会告诉您该值未设置。

相关问题