美文网首页iOS
iOS - nil,Nil,NULL,[NSNull null]

iOS - nil,Nil,NULL,[NSNull null]

作者: 厦门_小灰灰 | 来源:发表于2019-06-28 00:00 被阅读0次

    通过查看 objc/objc.h和objc/objc-api.h这两个头文件。

    objc/objc-api.h
    #ifndef __DARWIN_NULL
    #define __DARWIN_NULL NULL
    #endif
    
     objc/objc.h
    #ifndef Nil
    # if __has_feature(cxx_nullptr)
    #   define Nil nullptr
    # else
    #   define Nil __DARWIN_NULL
    # endif
    #endif
    
    #ifndef nil
    # if __has_feature(cxx_nullptr)
    #   define nil nullptr
    # else
    #   define nil __DARWIN_NULL
    # endif
    #endif
    
    另外定义了:
    #define NULL    ((void *)0)
    

    可见在Objective-C中,nil,Nil,NULL其实是等价的。
    可以通过代码进行验证。

        NSLog(@"nil == Nil: %d", (nil == Nil));
        NSLog(@"nil == NULL: %d", (nil == NULL));
        NSLog(@"Nil == NULL: %d", (Nil == NULL));
    
    结果:
    2019-06-27 23:44:02.723625+0800 study[7658:122899] nil == Nil: 1
    2019-06-27 23:44:02.723800+0800 study[7658:122899] nil == NULL: 1
    2019-06-27 23:44:02.723887+0800 study[7658:122899] Nil == NULL: 1
    

    下面说一下各自的含义:

    1. nil,Objective-C中的对象而使用的,表示对象为空,当一个对象置为nil时,这个对象的内存地址就会被系统收回。置空之后是不能进行retain,copy等跟引用计数有关的任何操作的;

    2. Nil,Objective-C中的类而使用的,表示类指向空;

    3. NULL,C语言指针而使用的,表示空指针;

    4. NSNull,继承于NSObject的类型,并且只有一个“+ (NSNull *) null;”类方法。它表示是空,什么也不存储,但是它却是对象,只是一个占位对象。NSNull对象拥有一个有效的内存地址。不像nil是一个空对象,已经完全从内存中消失;

    + (NSNull *)null;
    

    tips:
    空对象和值为空的对象的区别:

    • “空对象”是已经释放了内存地址的对象,即不存在的对象(nil,Nil);
    • “值为空的对象”是分配了地址,但是没有值得对象,是实际存在的对象([NSNull null]);

    相关文章

      网友评论

        本文标题:iOS - nil,Nil,NULL,[NSNull null]

        本文链接:https://www.haomeiwen.com/subject/yqcjcctx.html