1. nil
我们使用nil表示Objective-C对象为空,如NSString *str = nil。给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉;或者对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对象被置为nil, 我称它为空对象,对于这种空对象,所有关于retain的操作都会引起程序崩溃。如果一个类指针的值为nil,代表这个指针不指向任何对象。
例:Person *p1 = nil; 如果通过p1指针去调用对象的方法,运行不会报错,方法不会执行,也没有任何反应。
2. Nil
它是用于代表空类的。比如:Class myClass = Nil;
nil和Nil在使用上是没有严格限定的,也就是说凡是使用nil的地方都可以用Nil来代替,反之亦然。约定俗成地将nil表示一个空对象,Nil表示一个空类
3. NSNull
NSNull是继承于NSObject的类型。它是很特殊的类,它表示是空,什么也不存储,但是它却是对象,只是一个占位对象。
它的使用场景跟nil是不一样的,比如说服务端接口中,要求我们在值为空时,必须传入空值,就可以这样:NSDictionry *parameters = @{@"arg1" : @"value1",
@"arg2" : arg2.isEmpty ? [NSNull null] : arg2};
当然,正常情况下,我们也可以不传这人参数。
NSNull和nil的区别:nil是一个空对象,已经完全从内存中消失了;而NSNull为“值为空的对象”,这个类是继承NSObject,并且只有一个“+ (NSNull *) null;”类方法。(这就说明NSNull对象拥有一个有效的内存地址,所以在程序中对它的任何引用都是不会导致程序崩溃的。)
4. NULL
NULL是在C/C++中的空指针,在C语言中,NULL是无类型的,只是一个宏,它代表空。C语言中,当我们使用完一个指针以后,通常会设置其指向NULL。如果没有设置,这个指针就成了所谓的野指针,然后其它地方不小心访问了这个指针是很容易造成非法访问的,常见的表现就是崩溃了。
既然Objective-C是基于C语言的面向对象语言,那么也会使用到C语言类型的指针,比如使用const char *类型,判断是否为空时,是使用p != NULL来判断的。
PS:
NULL是宏,是对于C语言指针而使用的,表示空指针;
nil是宏,是对于OC中的对象而使用的,表示对象为空;
Nil是宏,是对于OC中的类而使用的,表示类指向空;
NSNull是类类型,是用于表示空的占位对象。
当向nil发送消息时返回NO,不会有异常,程序将继续执行下去;
而向NSNull的对象发送消息时会收到异常。
*在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法:+ (NSNull ) null;
网友评论