2009-02-06 58 views
0

我对设置应用程序使用NSUserDefaults。这是一个原始的副本,我根本没有为这个特定的设置向文件系统添加任何东西。我希望它是零,但与此相反..iPhone SDK上的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块确实得到执行。这是不是没有任何理由?

+0

[[NSUserDefaults standardUserDefaults] setObject:@“1”forKey:@“forgrounorbackrgound”]; [[NSUserDefaults standardUserDefaults] synchronize]; – GameLoading 2011-03-23 08:58:15

回答

6

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

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 

我认为你有别的东西怎么回事。

+0

标识符只是一个错字。 objectForKey:在这种情况下,确实不会返回零,不幸的是。 – Coocoo4Cocoa 2009-02-06 19:26:33

+0

它确实按照您认为的方式工作。你似乎在某个地方有另一个问题。 查看代码片段添加到我的答案底部 检查是否有一个[defaults registerDefaults:]方法被调用,播种某些数据或类似空字符串的东西。 – 2009-02-06 20:03:16

0

基础上的文档....

“默认的值必须是财产 名单,也就是一个实例(或 集合实例 的组合):NSData的,的NSString,NSNumber的, 的NSDate,NSArray的,或者NSDictionary的。如果 你想存储的任何其他类型的 的对象,你通常应该存档 它创建NSData的实例。 有关详细信息,请参阅用户默认为 编程主题可可。”

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