jungziege
jungziege

Reputation: 245

Testing equality to NSNull

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

Answers (4)

Liron Yahdav
Liron Yahdav

Reputation: 10732

Using @JE42's approach gives me a warning as of Xcode 5.1. Instead cast it:

(id)svcUser == [NSNull null]

Upvotes: 10

JE42
JE42

Reputation: 5159

Simply check for:

svcUser == [NSNull null]

This is the approach that Apple mentions in their docs.

Upvotes: 33

Joshua
Joshua

Reputation: 2451

You can check it by using:

 if(![svcUser isKindOfClass:[NSNull class]]){
    return [svcUser objectForKey:@"access_level"];
}

Upvotes: 8

rmaddy
rmaddy

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

Related Questions