nil
OC中nil 是一个宏,定义如下:
#define nil ((id)0)
NSString *str = nil; //实际会被转为
NSString *str = ((id)0); // 即 str = 0
它表示 将 0 强制转换为 id 类型(Objective-C 对象的通用指针类型)。
Objective-C 中,对象指针的本质是 C 指针,而 0(或 NULL)是 C 语言中表示空指针的标准方式。这里提供两个验证方式:
1、nil 和 0 的等价性:
2、指针的底层值:
nil、NULL 和 0 在指针层面是相同的,以下几行代码都不会报错
int *a = nil;
int *b = NULL;
NSString *c = NULL;
NSString *c = 0;
NSString *e = Nil;
为什么 Objective-C 要用 nil 而不是直接写 0?
语义清晰,nil 明确表示“空对象指针”,而 0 可能被误解为整数值,与 C 语言的 NULL 区分,NULL 用于 C 指针(如 int*),nil 用于 Objective-C 对象。但是从上述例子中也可以看到NULL和nil可以混用
Nil
Nil 表示指向 Objective-C 类(Class)的空指针。它是一个宏,定义为 (Class)0。可以说跟nil是一模两样了
用于 类的空指针,通常较少使用:
Class someClass = Nil;
if (someClass == Nil) {
NSLog(@"Class is Nil");
}
与 nil 类似,但用于 类对象(Class) 而不是实例对象。
NULL
NULL 是 C 语言标准的空指针,表示指向任何类型的空指针。通常定义为 (void *)0
int *ptr = NULL;
if (ptr == NULL) {
NSLog(@"ptr is NULL");
}
适用于 C 语言层面的指针(如 int*、char*)。
在 Objective-C 中,优先使用 nil 而不是 NULL
NSNull
在 NSArray 或 NSDictionary 中,nil 不能直接存储(因为 nil 表示列表结束),可以用 NSNull 占位
NSNull 是一个单例对象, 它只有一个单例方法:+[NSNull null],用于表示集合(如 NSArray、NSDictionary)中的空值。
它不是指针,而是一个 真正的 Objective-C 对象