Reputation: 245
Below is a code block, that is supposed to test to see if a dictionary is null, and if it isn't, pull out the correct object. However, for some reason, despite the fact that the if
check fails, the code still executes. Is there some quirk with how NSNull
works that I don't understand, or is this an Apple bug?
if (svcUser && !(svcUser == (id)[NSNull null])) {
return [svcUser objectForKey:@"access_level"];
}
Console response:
(lldb) print svcUser && !(svcUser == (id)[NSNull null])
(bool) $0 = false
(lldb) continue
-[NSNull objectForKey:]: unrecognized selector sent to instance 0x2b51678
Upvotes: 14
Views: 19588
Reputation: 10732
Using @JE42's approach gives me a warning as of Xcode 5.1. Instead cast it:
(id)svcUser == [NSNull null]
Upvotes: 10
Reputation: 5159
Simply check for:
svcUser == [NSNull null]
This is the approach that Apple mentions in their docs.
Upvotes: 33
Reputation: 2451
You can check it by using:
if(![svcUser isKindOfClass:[NSNull class]]){
return [svcUser objectForKey:@"access_level"];
}
Upvotes: 8
Reputation: 318854
NSNull
is a class. And like with all classes, you must use isEqual:
, not ==
to see if two objects represent the same value.
if (svcUser && ![svcUser isEqual:[NSNull null]]) {
return [svcUser objectForKey:@"access_level"];
}
Upvotes: 20