iPhone SDK上的NSUserDefaults没有返回nil

时间:2009-02-06 17:29:17

标签: cocoa-touch

我正在使用NSUserDefaults作为设置应用程序。这是一个原始副本,我没有为这个特定设置添加任何文件系统。我希望它是零,但恰恰相反......

如果我执行以下操作:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ( [defaults valueForKey:kIdentifierKey] == nil ) {
    return YES;
}
else {
    NSLog(@"we have a value. return NO. Value is: %@", [defaults objectForKey:kIdentifierKey]);
    return NO;
}

然而在NSLog中,没有任何东西显示出你期望价值的地方。 else块确实被执行了。有什么理由说这不是零吗?

2 个答案:

答案 0 :(得分:6)

valueForKey:在它搜索的所有地方都是一种复杂的方法。我发现在处理默认值时,使用getter获取特定数据类型会更可靠。

if ([defaults boolForKey:kIdentifierKey]) [self doSomething];

或者您可以使用objectForKey:它应该按预期返回nil。实际上,在创建NSLog语句时执行此操作。 nil的字符串描述是@“”,因此您的输出正如您所期望的那样。

此外,您正在测试和记录不同的密钥:

[defaults valueForKey:kIdentifierKey];
[defaults objectForKey:kGroupIdentifierKey];

确保您正在测试并记录您的想法。


从新的iPhone项目测试:

if (![[NSUserDefaults standardUserDefaults] valueForKey:@"foobar"])         NSLog(@"is not yet defined");
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"foobar"])        NSLog(@"is not yet defined");
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"foobar"] == nil)   NSLog(@"valueForKey is nil");
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"foobar"] == nil)  NSLog(@"objectForKey is nil");

输出:

is not yet defined
is not yet defined
valueForKey is nil
objectForKey is nil

我认为你还有其他事情发生。

答案 1 :(得分:0)

基于文档......

  

“默认值必须是属性   列表,即(或用于...的实例)   集合实例的组合   of):NSData,NSString,NSNumber,   NSDate,NSArray或NSDictionary。如果   你想存储任何其他类型的   对象,您通常应该存档   它创建一个NSData实例。   有关更多详细信息,请参阅用户默认值   可可的编程主题。“

此外,[defaults valueForKey:]不是根据文档的实例方法,因此结果很可能是未定义的。如果使用[defaults objectForKey:],如果找不到与kIdentifierKey关联的对象,则返回nil。