Cocoa touch iPhone SDK上的NSUserDefaults不返回nil

Cocoa touch iPhone SDK上的NSUserDefaults不返回nil,cocoa-touch,Cocoa Touch,我正在为设置应用程序使用NSUserDefaults。这是一个原始副本,我根本没有为这个特定设置向文件系统添加任何内容。我想是零,但恰恰相反 如果我这样做: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if ( [defaults valueForKey:kIdentifierKey] == nil ) { return YES; } else { NSLog(@"we have a valu

我正在为设置应用程序使用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块确实会被执行。有什么原因可以解释这不是零吗?

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

我想这里还发生了一些事情。

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
我想你还有别的事情要做。

根据文件

“默认值必须是属性 列表,即(或的)实例 集合是实例的组合 of):NSData、NSString、NSNumber、, NSDate、NSArray或NSDictionary。如果 您要存储任何其他类型的 对象,您通常应该进行归档 它可以创建NSData的实例。 有关详细信息,请参见用户默认值 Cocoa的编程主题。”

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

基于文档

“默认值必须是属性 列表,即(或的)实例 集合是实例的组合 of):NSData、NSString、NSNumber、, NSDate、NSArray或NSDictionary。如果 您要存储任何其他类型的 对象,您通常应该进行归档 它可以创建NSData的实例。 有关详细信息,请参见用户默认值 Cocoa的编程主题。”


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

valueForKey:是所有NSObject的实例方法。[[NSUserDefaults standardUserDefaults]setObject:@“1”forKey:@“forgrounorbackrgound”];[[NSUserDefaults standardUserDefaults]同步];valueForKey:是所有NSObjects的实例方法。[[NSUserDefaults standardUserDefaults]setObject:@“1”forKey:@“forgrounorbackrgound”];[[NSUserDefaults standardUserDefaults]同步];标识符只是一个输入错误。objectForKey:不幸的是,在这种情况下,它确实没有返回零。它确实按照您认为的方式工作。你好像在什么地方遇到了另一个问题。请参阅添加到我的答案检查底部的代码片段,以查看是否调用了[defaults registerDefaults:]方法,该方法正在植入一些数据或其他内容,如空字符串。标识符只是一个输入错误。objectForKey:不幸的是,在这种情况下,它确实没有返回零。它确实按照您认为的方式工作。你好像在什么地方遇到了另一个问题。请参阅添加到我的答案检查底部的代码片段,以查看是否调用了[defaults registerDefaults:]方法,该方法正在植入某些数据或其他内容,如空字符串。[[NSUserDefaults standardUserDefaults]setObject:@“1”forKey:@“forgrounorbackrgound”];[[NSUserDefaults standardUserDefaults]同步];[[NSUserDefaults standardUserDefaults]设置对象:@“1”forKey:@“forgrounorbackrgound”];[[NSUserDefaults standardUserDefaults]同步];