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

通过查看 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])