nil 是 Objective-C 对象的字面 null 值,对应于抽象类型 id 或通过 @interface 声明的任何 Objective-C 类型。例如:
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // do something
Nil 是 Objective-C 类的文字空值,对应于类型 Class。由于大多数代码不需要变量来引用类,因此它的使用并不常见。一个例子是:
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 是文字空值,即它不是对象。另一方面,NSNull 的单个实例是一个正确的对象。
NSNull 经常在 Foundation 集合中使用,因为它们不能存储 nil 值。对于字典,-objectForKey: 返回nil 表示给定的键在字典中没有对应的对象,即该键尚未添加到字典中。如果你想明确表示你有某个键但它还没有值,你可以使用[NSNull null]。
例如,由于字典无法存储 nil 值,因此以下代码会引发异常:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
另一方面,以下代码是有效的,因为[NSNull null] 是非nil 对象:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
值得一提的是,Foundation 集合具有使用nil 作为对象列表结尾标记的初始化程序,而无需指定列表中的元素数量。之所以会发生这种情况,是因为 nil 不能存储在 Foundation 集合中。例如,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
至于NIL 或NSNil,在Objective-C 或Apple Foundation 中没有这样的东西。