阐述
之前有个朋友问我 nil 是啥,下意识回答空。接着又问我Nil、NULL、NSNull是啥并有啥区别,顿时懵逼了。哎~ 找点资料弥补一下吧。
探讨
- NULL
C语言用 0 来作为不存在的原始值,用NULL作为不存在的指针( (void *) 0 )。
也就是说 NULL 是指向其他类型(如:基本类型、C类型)的空指针, 用于对非对象指针赋空值。
在stddef.h中定义如下:
#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
# if !defined(__MINGW32__) && !defined(_MSC_VER)
# define NULL __null
# else
# define NULL 0
# endif
#else
# define NULL ((void*)0)
#endif
- nil
Objective-C 在C语言的表达不存在的基础上增加了nil,nil是一个指向不存在的对象指针( 可以理解为 (id) 0 ),用于对Objective-C id对象赋空值。
定义如下:
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
- Nil
在Foundation/NSObjCRuntime.h中,Nil被定义为指向0的类指针(可以理解为 (Class) 0),表示对类进行赋空值。
定义如下:
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
- NSNull
在框架层面上 Foundation 定义了 NSNull 类型,即一个类方法 + null 返回一个单独的NSNull对象。它是一个实际的对象,不是一个0值(可以理解为 [NSNull null] ),表示空值的对象。
- nil,Nil,NULL,NSNull 整体比较:
所用资料