• 区分nil Nil NULL和NSNill(Objective C语言)(转)


     

             nil Nil NULL和NSNill作为Objective C语言中出现比较频繁的字眼,有时候不知道如何到底该选择哪一个?下面我们来详细分析这几个关键字的区别。

             nil在OC中的通过jump to Definition指向的定义为:
            #ifndef nil
                   #define nil NULL
            #endif /* ! nil */

           根据定义可以看出,其实nil只不过是NULL的另外一个别称而已。

           NULL在OC中的定义为:

           #ifndef NULL
                 #define NULL    __DARWIN_NULL
           #endif /* ! NULL */

            根据定义还看不出什么端倪。仔细搜索一下NULL的解释为,A null pointer to anything else,  is for C-style memory pointers.具体实现是: #define NULL ((void *)0)  。所以NULL是一种C风格的内存指针,并且为void类型,其值为0。

             nil和NULL都是在MacType.h中定义。并且NULL在nil之前定义。一般来说,NULL是C风格的,而nil是属于OC风格的。

             同样对Nil通过jump to Definition,会跳至objc.h文件中,Nil定义为:

              #ifndef Nil
                       #define Nil __DARWIN_NULL    /* id of Nil class */
              #endif
             还可以看到nil在该文件中定义:
              #ifndef nil
                      #define nil __DARWIN_NULL    /* id of Nil instance */
              #endif

             从该文件中对Nil和nil的定义可以看出,他们都是代表同样的对象。我们知道OC是一种区分字母大小写的语言,那为什么要定义Nil和nil呢?我们可以从Nil和nil后面的注释可以看出,Nil用来作为指向OC 空class的指针,而nil代表指向OC 空实例的指针。我想,这样定义应该是作为OC的编程规范吧!

             NSNull:其定义包含在Foundation.framework的NSNull.h中:

           #import <Foundation/NSObject.h>

            @interface NSNull : NSObject <NSCopying, NSCoding>

            + (NSNull *)null;

             @end

             从定义可以看出:NSNull是一个类,其含有一个类方法null,返回值为NSNull*。NSNull的实现采用单例设计模式。所以[NSNull null]返回一个NSNull实例。定义NSNull是由于集合对象中不能有nil值,所以用NSNull类来代表在集合对象中的null 值。英文解释:NSNull is a class defines a singleton object used to represent null values in collection objects (which don't allow nil values).
    [NSNull null]: The singleton instance of NSNull.

    总结:从技术实现上来说,nil、NULL都是一样的。但是实际上这种定义能够增加代码的可读性。如果你给某人传递NULL值,那么某人就认为接收到的是C指针。如果是nil,那么认为接受的是一个对象。而Nil,则认为接受的是class。

    那么NSNull与nil之间的区别有哪些呢?

    如何一个对象obj是nil,那么调用[obj message]将不会扔出NSException异常,并且会正常返回NO;

    如果一个对象obj为NSNull,那么[obj message]将会扔出NSException异常。

  • 相关阅读:
    数据结构——二叉树创建及遍历
    数据结构——二叉树基础
    数据结构——树
    C++拷贝构造函数
    链表C语言实现
    hrbust-oj 1937 神奇的进制转换
    UVALive 6736 Army Formation (容斥原理)
    POJ 2888 Magic Bracelet (Burnside + 矩阵加速dp)
    UVA 10601 Cubes (Burnside引理)
    UVA 11255 Necklace (BurnSide定理)
  • 原文地址:https://www.cnblogs.com/allen123/p/4452601.html
Copyright © 2020-2023  润新知