iOS_OC判空:NULL、nil、Nil、NSNull

2022-07-20 14:06:38 浏览数 (2)

代码语言: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

0 人点赞