Objective-c中的nil,NULL,Nil,NSNULL

0 阅读2分钟

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、指针的底层值:

图片

nilNULL 和 0 在指针层面是相同的,以下几行代码都不会报错

int *a = nil;
int *b = NULL;
NSString *c = NULL;
NSString *c0;
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],用于表示集合(如 NSArrayNSDictionary)中的空值

它不是指针,而是一个 真正的 Objective-C 对象