iOS - nil,Nil,NULL,[NSNull null]
2019-06-28 本文已影响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
下面说一下各自的含义:
-
nil,Objective-C中的对象而使用的,表示对象为空,当一个对象置为nil时,这个对象的内存地址就会被系统收回。置空之后是不能进行retain,copy等跟引用计数有关的任何操作的;
-
Nil,Objective-C中的类而使用的,表示类指向空;
-
NULL,C语言指针而使用的,表示空指针;
-
NSNull,继承于NSObject的类型,并且只有一个“+ (NSNull *) null;”类方法。它表示是空,什么也不存储,但是它却是对象,只是一个占位对象。NSNull对象拥有一个有效的内存地址。不像nil是一个空对象,已经完全从内存中消失;
+ (NSNull *)null;
tips:
空对象和值为空的对象的区别:
- “空对象”是已经释放了内存地址的对象,即不存在的对象(nil,Nil);
- “值为空的对象”是分配了地址,但是没有值得对象,是实际存在的对象([NSNull null]);