Actually my question here is: are null
and nil
equivalent or not?
I have an example but I am confused when they are equal when they are not.
NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
id aValue = [arrayWithNull objectAtIndex:0];
if (aValue == nil) {
NSLog(@"equals nil");
} else if (aValue == [NSNull null]) {
NSLog(@"equals NSNull instance");
if ([aValue isEqual:nil]) {
NSLog(@"isEqual:nil");
}
}
Here in the above case it shows that both null
and nil
are not equal and it displays "equals NSNull instance"
NSString *str=NULL;
id str1=nil;
if(str1 == str)
{
printf("\n IS EQUAL........");
}
else
{
printf("\n NOT EQUAL........");
}
And in the second case it shows both are equal and it displays "IS EQUAL".
Anyone's help will be much appreciated.
Thank you, Monish.
From http://www.iphonedevsdk.com/forum/iphone-sdk-development/34826-nil-vs-null.html
nil
andNULL
are 100% interchangeable.From:
NULL
is for C-style memory pointers.nil
is for Objective-C objects.Nil
is for Objective-C classes.Whenever you're writing Objective-C code, use
nil
Whenever you're writing C code, useNULL
But ultimately they're all defined as the same thing -- (void *)0, I think -- so in practice it doesn't really matter.
Make sure you typecast [NSNull null] to object type that you are comparing
otherwise you will receive a warning message saying "Comparison of distinct pointer types('type *' and 'NSNull *')
No,
NSNull
andnil
are not the same. They both represent a lack of value, and you might want to treat them the same, but they are still not equal.The
NSNull
object instance represents a null value, for example when you read data from a database that has null values.The
nil
value is a null pointer, i.e. it doesn't point to any object instance.In your second code you don't have any
NSNull
instance. AnNSString
pointer that contains a null pointer is not anNSNull
instance, it's still just a null pointer. You are comparing one null pointer to another, and they are of course equal.The concept is the same, with the difference that it's valid to send messages (call method) to nil.
NSNull is a real (singleton) class, that can be used for arrays or dictionnaries, who don't accept NULL or nil values.
Biggest difference between them: sending a message to an
NSNULL
object is probably going to cause a crash, whereas it's cool to send any message tonil
. For example, if you use a key path to get an array, like so:Then you will have an
NSNULL
object for any department whosename
isnil
. So, this is going to cause a crash:whenever
name
isNSNull
, because you just sent an unknown selector (lowercaseString
) to anNSNull
.Lesson: check for the
NSNull
object in an array before sending any message to its elements.nil
andNULL
are essentially the same,nil
is something like(NSObject *)0
, whileNULL
is more like(void *)0
. But both are pointers with an integer value of zero. You can send messages tonil
without raising an error.NSNull
andNULL
(ornil
, of course) are different things, however. You just useNSNull
as a helper to add anempty
object to anNSArray
or another container class, since you can't addnil
to them. So instead, you use[NSNull null]
as a replacement, and you have to check if an array element isNSNull
, not if it'snil
(it will never be equal tonil
).