NSUserDefaults nullcheck不起作用

时间:2013-06-25 15:32:18

标签: ios nsuserdefaults

我在使用以下代码时遇到一些问题,即使在userDefaults中找不到任何内容,loadTheme变量似乎也不会为null:

NSString *loadTheme = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"theme"]];

if (!loadTheme){
    NSLog(@"No theme set");
    loadTheme =  @"Default";
}

如果存储中没有任何内容(userdefaults)

,如何正确确保if子句运行?

3 个答案:

答案 0 :(得分:1)

根据documentation,如果密钥不存在,则返回nil。您应该将过程构造为:

NSString *theme = [[NSUserDefaults standardUserDefaults] stringForKey:@"theme"];
if (theme == nil) {
   /* No theme, probably throw an error, return, and/or use a default value */
}
/* Theme is there, do whatever with "theme" */

答案 1 :(得分:0)

你可以这样做。

NSString *loadTheme = [NSUserDefaults standardUserDefaults] stringForKey:@"theme"];
if (loadTheme.length == 0) {
    NSLog(@"No theme set");
    loadTheme =  @"Default";
}

当你通过stringWithFormat:方法生成NSString时,它永远不会是nil。通过使用字符串的长度,您可以告诉所有@“”和nil(如果尚未设置值)来自其他字符串。请务必确保将NSString保存到用户默认密钥。如果无法获得NSString或nil,则可能会出现无法识别的选择器错误。

答案 2 :(得分:0)

我发现这是NSUserDefaults on iPhone SDK not returning nil

的一部分

从新的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

所以从上面你必须得到解决方案。

另外,

NSString *loadTheme = [[NSUserDefaults standardUserDefaults] valueForKey:@"theme"]; 

就足够了,不需要使用stringWithFormat: