检查standardUserDefaults中的密钥是否已设置或是否为NSNull

时间:2014-11-30 17:17:46

标签: ios objective-c iphone

检查standardUserDefaults内容的正确方法是什么?

如果我打印出钥匙中存储的内容,我会:

NSLog(@"logged_in_status : %@", [standardUserDefaults stringForKey:@"logged_in_status"]);
Output: logged_in_status : (null)

所以它似乎是NSNull。

所以我将按如下方式添加一个检查:

 if ([[standardUserDefaults objectForKey:@"logged_in_status"] isKindOfClass:[NSNull class]])
        {
            NSLog(@"YES");
        }
        else
        {
            NSLog(@"NO");
        }

输出:否

为什么这不能解决为YES?这不是NSNull吗?

我已经看了很长时间了,看不出错误在哪里。 有人可以解释一下我在哪里出错吗?

谢谢, 代码

2 个答案:

答案 0 :(得分:2)

当你最初进行密钥查找时,你并没有收回NSNull的实例,而是根本没有结果:换句话说,nil,这不是{&1;}。和NSNull一样。这通常意味着尚未在用户默认值中为该键设置任何值。 (如果你在调试器中查看它时可以看到这一点 - 当你将nil打印到日志时,&{34;字符串化"版本的"(null)"恰好是NSString * loggedInStatus = [standardUserDefaults stringForKey:@"logged_in_status"]; if (!loggedInStatus) { NSLog(@"status not set"); } else { NSLog(@"status: %@", loggedInStatus); } ,这部分是我认为可能会让人困惑的。)

(如果这种区别对你来说很模糊,请看一下这个问题的答案,关于各种形式的" null"你可能会遇到:What are the differences between nil, NULL and [NSNULL nil]?

正如@Francescu在评论中建议的那样,如果您正在尝试检查"是否已将此值设置为",它可能看起来像:

{{1}}

答案 1 :(得分:0)

对其他答案的一些额外信息:当您格式化包含%@格式说明符的字符串时,nil值将格式化为带有括号的“(null)”。 NSNull - 实例的实例,因为它是单例 - 格式为“< null>”用尖括号。