- 描述的对象不同
nil
描述的是ObjC中的对象(Object)的“值”为空,Nil
描述的是ObjC中的类的“值为空”。一般而言,并不需要变量去引用类,所以Nil
应用比较少。一个例子是:
Class someClass = Nil;
Class anotherClass = [NSString class];```
```NULL```描述的是任意C指针的“值”为空。比如:
int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;
```NSNull``` 是一个描述空(null)的类,事实是该类只有一个对象,即类方法[NSNull null]的返回值。它和```nil``` 不同,因为```nil``` 是一个字面意义的空值(literal null value),也就是说```nil``` 不是一个对象,而```NSNull``` 的单列则是一个完全意义的对象。
```NSNull``` 经常用于Foundation框架中的集合类(```collection``` 类,包含```NSArray``` ,```NSDictionary``` ,```NSSet``` 等),因为它们不能用于存储```nil``` 值。
在```NSDictionary``` 的方法中,```-objectForKey:``` 通过返回```nil``` 来指明给定的键key在字典中没有对应的对象,也就是说,这个键Key还没有被添加到这个字典中。如果你希望显示地表明字典中含有一个没有值的键Key,你可以使用```[NSNull null]```。例如,因为字典不能存储nil值,以下的一行代码将抛出一个异常:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
另一方面,以下的代码是合法的,因为```[NSNull null]``` 是一个非空(non-nil)对象:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
值得一提的是,在Foundation的集合类(collection类)中,之所以能够使用nil作为标记一列对象结束的标记符而不需要特别指明该列元素的个数,就是因为```nil```不能被存储在Foundation的集合类(collection类)中。