代码语言:javascript复制
NULL = (void *)0 C指针的字面空值
nil = (id)0 OC对象的字面空值
Nil = (Class)0 OC类的字面空值
NSNull = [NSNull null] 空值的OC对象
具体如下:
代码语言:javascript复制//1. NULL
//表示C的指针空值
int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;
代码语言:javascript复制// 2. nil
// 表示指向OC对象的指针为空
NSString *str = nil;
NSURL *url = nil;
id obj = nil;
if (obj == nil) {
// todo ...
}
代码语言:javascript复制// 3. Nil
// 表示只想OC类 类型的指针为空
Class class = Nil;
Class class2 = [NSString class];
代码语言:javascript复制// 4. NSNull:一个OC对象,用于表示空值的类
// 只有一个单例方法: (NSNull *)null;
// 一般用于集合对象中保存一个空的占位对象:
因为Foundation集合对象中,nil通常被用于表示集合对象结束的标志,
因此无法用nil来存储一个空值,所以一般用[NSNull null]来存
// 例1:当 NSArray 里遇到 nil 时,就说明这个数组对象的元素截止了
#warning NSArray 只关注 nil 之前的对象,nil 之后的对象会被抛弃!!!
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil, @"three"]; // Missing sentinel in method dispatch
NSLog(@"%@", array);
// 结果如下
// (
// one,
// two
// )
// 例2:
// 错误的使用
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// [dict setObject:nil forKey:@"friends"];
// 报错:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: friends)'
// 正确的使用
[dict setObject:[NSNull null] forKey:@"friends"];
reference