其实早就想研究一下nil、Nil、NULL和NSNull之间的区别,只是工作上除了nil,其它的几乎少有用到,所以一直拖到今天。有时候感觉自己越来越浮躁,对细微处的知识理解不够深入,因此这里给自己提个醒--在以后的工作当中要始终保持一种钻研的精神!
言归正传,我们来分别介绍一下这四种类型:
一、nil
我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉;
或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对象为nil,我称它为“空对象”。(注意:我这里强调的是“空对象”,下面我会拿它和“值为空的对象”作对比!!!)
所以对于这种空对象,所有关于retain的操作都会引起程序崩溃,例如字典添加键值或数组添加新原素等,具体可参考如下代码:
二、NSNull
NSNull和nil的区别在于,nil是一个空对象,已经完全从内存中消失了,而如果我们想表达“我们需要有这样一个容器,但这个容器里什么也没有”的观念时,我们就用到NSNull,我称它为“值为空的对象”。如果你查阅开发文档你会发现NSNull这个类是继承NSObject,并且只有一个“+ (NSNull *) null;”类方法。这就说明NSNull对象拥有一个有效的内存地址,所以在程序中对它的任何引用都是不会导致程序崩溃的。参考代码如下:
三、Nil
nil和Nil在使用上是没有严格限定的,也就是说凡是使用nil的地方都可以用Nil来代替,反之亦然。只不过从编程人员的规约中我们约定俗成地将nil表示一个空对象,Nil表示一个空类。参考代码如下:
四、NULL
我们知道Object-C来源于C、支持于C,当然也有别于C。而NULL就是典型C语言的语法,它表示一个空指针,参考代码如下:
int *ponit = NULL;NSString *ss = nil;
if (nil == ss) {
NSLog(@" nil --> (null) --> %@",ss);
}
// NSNull是个单例,只有一个方法null,也用来表示空值。但它出现在一些nil无法胜任的场景来替代nil来表示空值。比如NSArray和NSDictionary中nil代表数组或字典的末尾(即使nil不出现在末尾,也会将其切断,nil后面的值会丢失),此时只能用NSNull对象来表示空值:
NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = @[nullValue];
NSLog(@" arrayWithNull: %@", arrayWithNull);
NSString *s = @"";
if ([s isEqual:[NSNull null]]) {
NSLog(@" == %@", ss);
}