nil / Nil / NULL / NSNull 的区别
NULL在C中被定义,但是C并不包括nil、Nil和NSNull,这三者属于Objective-C(下称OC)部分。

- NULL是什么?
int *a = NULL;
A null pointer to anything else, is for C-style memory pointers.
它是C类型的一个指针变量,确切地说是一个空指针,不指向任何地方,在内存上它的值被设置为0。比如说int *pointer = NULL,指针变量pointer在内存里的值为0,不指向任何地方。
本质:空指针
- nil和Nil是什么?
NSObject *obj = nil;
nil: A null pointer to an Objective-C object. (OC对象的空指针。)
Class *class = Nil;
Nil: A null pointer to an Objective-C class. (OC类的空指针。)
本质:空指针,他俩压根就是NULL
- NSNull是什么?
[NSArray arrayWithObjects:@"Steve Jobs", [NSNull null], @"Tim Cook", nil];
官方解释:The NSNull class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).
NSNull继承与NSObject,仅有一个方法[NSNull null]。当调用这个方法的时候,在内存中开辟出一块空间,并返回这块空间的首地址指针。它仅有一个用途,那就是代表集合对象中的空对象,起到占坑作用。
本质:OC空对象
- 总结:

(1)NULL、nil和Nil本质同为空指针。如下测试代码:
if(NULL == nil && NULL == Nil)
NSLog(@"NULL == nil && NULL == Nil");
else
NSLog(@"NULL != nil || NULL != Nil");
控制台打印结果:"NULL == nil && NULL == Nil"。
(2)空指针与OC空对象的区别。

空指针:这个指针(a、obj1、class)不指向任何,数据为0。
OC空对象:这个指针(obj2)指向一个在内存开辟出来的OC空对象。
(3)注意正确使用NULL、nil和Nil编码。
作者声明:若有错误,还请纠正,不胜感激!
浙公网安备 33010602011771号