检查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吗?
我已经看了很长时间了,看不出错误在哪里。 有人可以解释一下我在哪里出错吗?
谢谢, 代码
答案 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>”用尖括号。