14

下面是一个代码块,它应该测试字典是否为空,如果不是,则取出正确的对象。但是,由于某种原因,尽管if检查失败,但代码仍然执行。是否有一些NSNull我不理解的工作方式的怪癖,或者这是苹果的错误?

if (svcUser && !(svcUser == (id)[NSNull null])) {
    return [svcUser objectForKey:@"access_level"];
}

控制台响应:

(lldb) print svcUser && !(svcUser == (id)[NSNull null])
(bool) $0 = false
(lldb) continue
-[NSNull objectForKey:]: unrecognized selector sent to instance 0x2b51678
4

4 回答 4

31

只需检查:

svcUser == [NSNull null]

这是 Apple 在其文档中提到的方法。

于 2013-12-03T15:36:46.517 回答
20

NSNull是一类。与所有类一样,您必须使用isEqual:, 而不是==查看两个对象是否表示相同的值。

if (svcUser && ![svcUser isEqual:[NSNull null]]) {
    return [svcUser objectForKey:@"access_level"];
}
于 2013-05-17T02:10:11.440 回答
10

从 Xcode 5.1 开始,使用@JE42 的方法会给我一个警告。而是投它:

(id)svcUser == [NSNull null]
于 2014-04-03T00:28:14.467 回答
8

您可以使用以下方法进行检查:

 if(![svcUser isKindOfClass:[NSNull class]]){
    return [svcUser objectForKey:@"access_level"];
}
于 2013-05-17T02:15:27.807 回答