在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别:

Symbol Value Meaning
NULL (void *)0 literal null value for C pointers
nil (id)0 literal null value for Objective-C objects
Nil (Class)0 literal null value for Objective-C classes
NSNull [NSNull null] singleton object used to represent null

一、nil:对象为空

定义某一实例对象为空值。例如:

  1. NSObject* obj = nil;
  2. if (nil == obj) {
  3. NSLog(@"obj is nil");
  4. }
  5. else {
  6. NSLog(@"obj is not nil");
  7. }

二、Nil:类为空

定义某一类为空。例如:

  1. Class someClass = Nil;
  2. Class anotherClass = [NSString class];

三、NULL:基本数据对象指针为空

用于c语言的各种数据类型的指针为空。例如:

  1. intint *pointerToInt = NULL;
  2. charchar *pointerToChar = NULL;
  3. struct TreeNode *rootNode = NULL;

四、NSNull

集合对象无法包含 nil 作为其具体值,如NSArray、NSSet和NSDictionary。相应地,nil 值用一个特定的对象 NSNull 来表示。NSNull 提供了一个单一实例用于表示对象属性中的的nil值。

  1. @interface NSNull : NSObject <NSCopying, NSSecureCoding>
  2. + (NSNull *)null;
  3. @end

在NSNull单例类中,提供了唯一的方法null:Returns the singleton instance of NSNull.

例如:

  1. NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
  2. mutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for `someKey`
  3. NSLog(@"Keys: %@", [mutableDictionary allKeys]); // @[@"someKey"]

五、说明:

Technically they're all the same, but in practice they give someone reading your code some hints about what's going on; just like naming classes with a capital letter and instances with lowercase is recommended, but not required.

If someone sees you passing NULL, they know the receiver expects a C pointer. If they see nil, they know the receiver is expecting an object. If they see Nil, they know the receiver is expecting a class. Readability.

六、注

下面附带几个有趣的例子:

(1)

  1. NSObject *obj1 = [[NSObject alloc] init];
  2. NSObject *obj2 = [NSNull null];
  3. NSObject *obj3 = [NSObject new];
  4. NSObject *obj4;
  5. NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil nil];
  6. NSLog(@"arr1 count: %ld", [arr1 count]);    //arr1 count: 3
  7. NSObject *obj1;
  8. NSObject *obj2 = [[NSObject alloc] init];
  9. NSObject *obj3 = [NSNull null];
  10. NSObject *obj4 = [NSObject new];
  11. NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil nil];
  12. NSLog(@"arr2 count: %ld", [arr2 count]);   //arr2 count: 0

为啥第一个数组元素有三个,而第二个数组元素为0.先看看:

  1. NSObject* obj;
  2. if (nil == obj) {
  3. NSLog(@"obj is nil");
  4. }
  5. else {
  6. NSLog(@"obj is not nil");
  7. }

这个输出:obj is nil。而NSArray是以nil结尾的。所以知道原因了吧!

(2)

    1. //有异常!
    2. NSObject *obj1 = [NSNull null];
    3. NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];
    4. for (NSString *str in arr1) {
    5. NSLog(@"array object: %@", [str lowercaseString]);
    6. }
    7. //修改
    8. NSObject *obj1 = [NSNull null];
    9. NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];
    10. for (NSString *str in arr1) {
    11. if (![str isEqual:[NSNull null]]){
    12. NSLog(@"array object: %@", [str lowercaseString]);
    13. }
    14. }

Objective-c nil, Nil, NULL和NSNull的区别的更多相关文章

  1. [BS-22] Objective-C中nil、Nil、NULL、NSNull的区别

    Objective-C中nil.Nil.NULL.NSNull的区别 1.定义: nil:      OC语言定义:#define nil __DARWIN_NULL   /  #define __D ...

  2. iOS 中nil,Nil,NULL,NSNull的区别

    类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...

  3. Objective C语言中nil、Nil、NULL、NSNull的区别

    以下内容是基于搜集整理的网上资料,供参考. nil:指向Objective C语言中对象的空指针,其定义值为(id)0. Nil:指向Objective C语言中类(Class)的空指针,其定义值为( ...

  4. nil、Nil、NULL、NSNull的区别

    nil:指向一个对象的空指针,对objective c id 对象赋空值. Nil:指向一个类的空指针,表示对类进行赋空值. NULL:指向其他类型(如:基本类型.C类型)的空指针, 用于对非对象指针 ...

  5. nil、Nil、NULL和NSNull的区别和联系

    一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对 ...

  6. nil、Nil、NULL与NSNull的区别--备用

    我们来分别介绍一下这四种类型: 一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统 ...

  7. nil、Nil、NULL与NSNull的区别及应用

      总结 nil:OC中的对象的空指针 Nil:OC中类的空指针 NULL:C类型的空指针 NSNull:数值类的空对象 详细解析应用如下: 1.nil 指向一个对象的指针为空 在objc.h中的定义 ...

  8. OC中nil、Nil、NULL、NSNull的区别

    nil:指向OC中对象的空指针 e.g.: NSString *string = nil; Nil:指向OC中类的空指针    e.g.:Class class = Nil; NULL:指向其他类型的 ...

  9. iOS中nil、 Nil、 NULL和NSNull的区别

    参考链接:https://www.jianshu.com/p/c3017ae6684a

  10. 1.import和include区别 2.NSLog 和printf区别 3.创建对象做的事情 4. 类和对象方法比较 5 匿名对象优缺点 6. 封装 7.作用域范围 8.id和instancetype 9.自定义构造方法规范 10.nil和Nil及NULL、NSNull区别

    1.import和include的区别: import可以防止头文件的重复包含 2.NSLog 和printf的区别: 1,NSLog可以自动换行, 输出调试信息, printf不能. 2,NSLog ...

随机推荐

  1. js按值及引用传递中遇到的小问题

    有人闲的蛋疼,非要在函数中使用如下方式传值,尼玛一下把我搞糊涂了.于是决定发挥打破沙锅问到底的精神搞清楚它. var a = 1,b = [], c = {}; function f(a, b, c) ...

  2. hdu 1690 Bus System(Dijkstra最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1690 Bus System Time Limit: 2000/1000 MS (Java/Others ...

  3. Struts2+Hibernate实现图书管理系统

    效果图 部分代码 Books.java package entity; import java.util.Date; public class Books { //书籍编号 private Strin ...

  4. socket编程中write、read和send、recv之间的区别~转载

    socket编程中write.read和send.recv之间的区别   http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...

  5. Linux 入门记录:十、Linux 下获取帮助

    一.获取帮助 Linux 提供了极为详细的帮助工具和文档,通过查阅相关文档,可以大大减少需要记忆的东西并提高效率. 二.--help参数 几乎所有命令都可以使用 -h 或 --help 参数获取命令的 ...

  6. Java GC策略

    本文转自https://blog.csdn.net/rabbit_in_android/article/details/50386954 内存管理和垃圾回收 JVM内存组成结构 JVM栈由堆.栈.本地 ...

  7. C基础 算法实现层面套路

    引言 - 从实践狗讲起 理论到实践(有了算法到实现) 中间有很多过程. 算法方面本人啥也不懂, 只能说说实现方面. 例如下面 一个普通的插入排序. // // 插入排序默认从大到小 // extern ...

  8. 数据库简述(以MySQL为例)

    一.数据库中的概念 1.数据库是用户存放数据.访问数据.操作数据的存储仓库,用户的各种数据被有组织地存放在数据库中.可以随时被有权限的用户查询.统计.添加.删除和修改.可以说,数据库是长期存储在计算机 ...

  9. 3:django models Making queries 高级进阶--聚合运算

    在前一遍文章django models Making queries里面我们提到了django常用的一些检索数据库的内容, 下面我们来看一下更为高级的检索聚合运算 这是我们要用到的模型 class A ...

  10. 【linux】crontab定时命令

    参考来源: http://blog.csdn.net/ariessurfer/article/details/7459183 http://www.jb51.net/LINUXjishu/19905. ...