nil、Nil、NULL和NSNull
文章目录
- nil、Nil、NULL和NSNull
- nil
- NSNull
- Nil
- NULL
- 总结:
我们先来看看这几个苹果官方文档的解释:
- nil:Defines the id of a null instance.(定义空实例的id)
- Nil:Defines the id of a null class.(定义空类的id)
- NULL:Returns the singleton instance of NSNull.(返回NSNull的单例实例)
- NSNull:A singleton object used to represent null values in collection objects that don’t allow nil values.(用于表示不允许空值的集合对象中的空值的单例对象)
我们来看看这四个的打印值:
NSLog(@"%@", nil);
NSLog(@"%@", Nil);
NSLog(@"%@", NULL);
NSLog(@"%@", [NSNull null]);
nil
我们使用nil
表示Objective-C对象为空,如NSString *str = nil
。nil
就代表((void *)0)
我们给对象赋值时一般会使用object = nil
,表示我想把这个对象释放掉;
或者对象由于某种原因,经过多次release
,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对象为nil
,它为“空对象”。(注意:是“空对象”,不是“值为空的对象”)
所以对于这种空对象,所有关于retain
的操作都会引起程序崩溃。
如果一个类指针的值为nil
代表这个指针不指向任何对象。
NSNull
这是一个单例类,在不允许空对象的集合对象中使用,来代表空值。这说明NSNull
对象拥有一个有效的内存地址,在程序中对它的任何引用都是不会导致程序崩溃的。
上面打印了它,打印它的地址看看:
NSLog(@"%p", [NSNull null]);
总结:NSNull
和nil
的区别在于,nil
是一个空对象,已经完全从内存中消失了,而如果想表达“我们需要有这样一个容器,但这个容器里什么也没有”的观念时,就要用到NSNull
,它是“值为空的对象”。
Nil
Nil
也就代表((void *)0)
。nil
和Nil
在使用上是没有严格限定的,也就是说凡是使用nil
的地方都可以用Nil
来代替,反之亦然。只不过从编程人员的规约中我们约定俗成地将nil
表示一个空对象,Nil
表示一个空类。
Class myClass = Nil;
NULL
在C语言中,NULL
是无类型的,只是一个宏,它代表空。NULL
其实就是在C/C++中的空指针。
总结:
NULL
、nil
、Nil
这三者对于Objective-C中值是一样的,都是(void *)0
。
NULL
是宏,是对于C语言指针而使用的,表示空指针。nil
是宏,是对于Objective-C中的对象而使用的,表示对象为空。Nil
是宏,是对于Objective-C中的类而使用的,表示类指向空。NSNull
是类类型,是用于表示空的占位对象,与JS或者服务端的null
类似的含意。