OC中Nil nil NULL 和 [NSNULL null]的区别

时间:2023-07-25 15:40:38

关于这个问题看过两三次了,但是每次过两个月脑袋里又会不清晰,索性记录一下加深一下印象。

一、nil

当一个对象置为nil时,这个对象的内存地址就会被系统收回。置空之后是不能进行retain,copy等跟引用计数有关的任何操作的。

比如:

    NSMutableArray * array = [NSMutableArray array];
NSDictionary * dic = [NSDictionary dictionary];
id object = nil;
[array addObject:object];
[dic setValue:object forKey:@"key"];

上述操作都是错误的

二、Nil

nil完全等同于Nil,只不过由于编程习惯,人们一般把对象置空用nil,把类置空用Nil。

三、NULL

这个是从C语言继承来的,就是一个简单的空指针

四、[NSNULL null]

这个才是重点:[NSNull null]和nil的区别在于,nil是一个空对象,已经完全从内存中消失了,而如果我们想表达“我们需要有这样一个容器,但这个容器里什么也没有”的观念时,我们就用到[NSNull null],它就是为“值为空的对象”。如果你查阅开发文档你会发现NSNull这个类是继承NSObject,并且只有一个“+ (NSNull *) null;”类方法。这就说明NSNull对象拥有一个有效的内存地址,所以在程序中对它的任何引用都是不会导致程序崩溃的。