Difference between nil, NIL and, null in Objective-C
Objective CNullNsnullObjective C Problem Overview
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.
Objective C Solutions
Solution 1 - Objective C
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.
Solution 2 - Objective C
I am not sure but i think nil
should only be used in place of an id
, what Java and C++ programmers would think of as a pointer
to an object
. Use NULL
for non-object pointers.
nil
is usually used for an Objective-C object type, while NULL
is used for c-style pointers
Solution 3 - Objective C
Nil,Null and nil are used with below
1> Nil for Objective c Class
2> nil for Objective c object
3> Null for C pointer
Example:
1>Class A=Nil;
2>NSString strName=nil;
3>char *pointerChar = NULL;
Solution 4 - Objective C
Suppose you have a class MyClass
then by convention nil
is used if you want to initialize its instance to null value (same as null
in java)
i.e.
MyClass *obj = nil;
and if you want to initialize a primitive pointer to null value (same as in c) you use
int *ptr = NULL;
and if you want to initialize to Class
reference to null value (same as null
in java) then use
Class classRefOfMyClass = Nil;
It's just a convention otherwise Nil or nil have same meaning and perhaps NULL , nil or Nil all are same.
Here is the definition for these in objc.h
file
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
And in stddef.h
#define NULL ((void*)0)
And the definition of __DARWIN_NULL
in _types.h
#define __DARWIN_NULL ((void *)0)
So there is no difference logically. The main idea here is to initialize a pointer whether C
or Objective-C
to 0
. If you have knowledge of C
then you can assign
int *ptr = 0;
without type casting 0
to a pointer. As you don't need to typecast 0
to assign it to a pointer.
0
and nothing else.
In short they all are Solution 5 - Objective C
This will help you to understand the difference between nil,NIL and null.
> All three of these values represent null, or zero pointer, values. The > difference is that while NULL represents zero for any pointer, nil is > specific to objects (e.g., id) and Nil is specific to class pointers. > It should be considered a best practice of sorts to use the right null > object in the right circumstance for documentation purposes, even > though there is nothing stopping someone from mixing and matching as > they go along.
The below link may help you in some way:
Here is some important part from the link:
Solution 6 - Objective C
nil, NIL and null. is depended on your requirement.
NSNull
collections like NSArray
and NSDictionary
not being able to contain nil values.
NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary];
MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey"
NSLog(@"Keys: %@", [mutableDictionary allKeys]);
nil
all pointers that object has to other objects begin as nil, so it's unnecessary to, for instance, set self.(association) = nil in init methods.
In other languages, like C++, this would crash your program, but in Objective-C, invoking a method on nil returns a zero value.
if (name != nil)
{
........
}
Symbol Value Meaning
nil (id)0 literal null value for Objective-C objects
Nil (Class)0 literal null value for Objective-C classes