Comparing to NSNull

Checks to NSNull come up a lot when dealing with things like parsing JSON and while it’s mostly just ==, there are some options.

The officially sanctioned method is NSNull sample code, but this will generate a warning in clang (BOOO HISSSS).

So here are the options as I see them:

- (void)someMethod
{
	NSString *aString = @"loremipsum";
	
	// This will complain: "Comparison of distinct pointer types ('NSString *' and 'NSNull *')"
	if (aString != [NSNull null])
	{
		
	}
	
	// This works (at least for strings), but isEqual: does different things 
	// for different classes, so it's not ideal
	if ([aString isEqual:[NSNull null]]) 
	{
		
	}
	
	// If you cast it to the class you're comparing against
	// then you're good to go
	if (aString != (NSString *)[NSNull null])
	{
		
	}
	
	// But we can also just cast it to id and
	// that works generically
	if (aString != (id)[NSNull null])
	{
		
	}
	
	// The thing that would be really cool,
	// would be [NSNull null] returning
	// id (like in the sample category below).
	// Wouldn't count on that one though.
	if (aString != [NSNull idNull])
	{
		
	}
}
@interface NSNull (idNull)
+ (id)idNull;
@end
@implementation NSNull (idNull)
+ (id)idNull { return [NSNull null]; }
@end

Casting to (id) seems like the simplest way to handle this one, so that’s the one I’m using right now.

Update:

One of my coworkers, @pgor, pointed out that he uses NSNull’s isEqual, which seems like a sensible enough thing to do. (I’m guessing Apple isn’t going to toss anything too screwy into an isEqual on an object that’s basically single purpose.)

if ([[NSNull null] isEqual:aString]) 
{
		
}

Also forgot to mention in the original post: it’s worth filing a bug against the documentation on NSNull to see what Apple’s official position is in this post static humiliator world we inhabit.

Radar

Updated: