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 对象