我正在使用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 :(得分: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。