Search code examples
objective-cnullnsnull

Difference between nil, NIL, and null in Objective-C


I want to know the difference between nil, NIL, and null. I've googled around and found this:

nil -> null pointer to Objective-C object

NIL -> null pointer to Objective-C class

null -> null pointer to primitive type or absence of data

But I'm not able to understand the terms "Objective-C object" and "class" clearly.

Please explain this to me. Also, is there any word like NSNull or NSNil in Objective-C? If so, then please explain for what it is for.


Solution

  • nil is the literal null value for Objective-C objects, corresponding to the abstract type id or any Objective-C type declared via @interface. For instance:

    NSString *someString = nil;
    NSURL *someURL = nil;
    id someObject = nil;
    
    if (anotherObject == nil) // do something
    

    Nil is the literal null value for Objective-C classes, corresponding to the type Class. Since most code doesn’t need variables to reference classes, its use is not common. One example is:

    Class someClass = Nil;
    Class anotherClass = [NSString class];
    

    NULL is the literal null value for arbitrary C pointers. For instance,

    int *pointerToInt = NULL;
    char *pointerToChar = NULL;
    struct TreeNode *rootNode = NULL;
    

    NSNull is a class for objects that represent null. In fact, there’s only one object, namely the one returned by +[NSNull null]. It is different from nil because nil is a literal null value, i.e., it isn’t an object. The single instance of NSNull, on the other hand, is a proper object.

    NSNull is often used in Foundation collections since they cannot store nil values. In the case of dictionaries, -objectForKey: returns nil to indicate that a given key has no corresponding object in the dictionary, i.e., the key hasn’t been added to the dictionary. If you want to make it explicit that you have a certain key but it doesn’t have a value yet, you can use [NSNull null].

    For instance, the following throws an exception because dictionaries cannot store nil values:

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:nil forKey:@"someKey"];
    

    On the other hand, the following code is valid since [NSNull null] is a non-nil object:

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:[NSNull null] forKey:@"someKey"];
    

    It’s worth mentioning that Foundation collections have initialisers that use nil as a marker for the end of a list of objects without having to specify the number of elements in the list. This can only happen because nil cannot be stored in a Foundation collection. For instance,

    NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
    

    As for NIL or NSNil, there are no such things in Objective-C or Apple Foundation.