在C语言里用0
来作为“不存在”的原始值,而用NULL
作为指针空值。OC里表示“不存在”的四种方式为:NULL
、nil
、Nil
、NSNull
。
NULL
NULL
本质为:(void*)0
使用惯例:NULL
一本用于表示C指针空值,比如:
int *a = NULL;
char *b = NULL;
struct User *userM = NULL;
当某个API想要传入某个指针(void *)
,而不是id类型时,最好还是传入NULL
,以此保持了Objective-C严谨的定义。比如NSArray的这个API,argument要求的是id,所以传入nil
会比较好。
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument
而像NSMutableArray的sortUsingFunction:context:
- (void)sortUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))compare context:(nullable void *)context;
在这里,context传入NULL
会比传入nil
好。
nil
nil
本质为:(void*)0
nil
特点:虽然为空,仍然可以向它发送消息,在nil上调用方法都返回一个零值。
NSString *name;
NSLog(@"%p %hhd", name, [name isEqualToString:@"CoderKo1o"]); // 0x0 0
使用惯例:nil
用于表示指向OC对象(id类型的对象,或者使用@interface声明的OC对象)的指针为空,例如:
NSString *string = nil;
id object = nil;
Nil
Nil
本质也是:(void *)0
使用惯例:Nil
用于表示指向OC类(Class)类型的指针为空,例如:
Class someClass = Nil;
Class stringClass = [NSString class];
NSNull
NSNull
是一个OC对象,是一个用于表示空值的类,只有一个单例方法:+[NSNull null],一般用于在集合对象中保存一个空的占位对象。
使用惯例:在Foundation集合对象(NSArray、NSDictionary、NSSet等)中有一个nil
值得缺陷,因为语法规定了这些集合是以nil为结束标志的。因此无法用nil
来存储一个空值,所以一般使用[NSNull null]
空对象来存储。
NSArray * array = [NSArray arrayWithObjects:@"name",@"age", nil];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"object",@"key",@"zhh",@"name",nil];
当如下情况时,数组里只有name和age:
NSArray * array = [NSArray arrayWithObjects:@"name",@"age", nil,@"wo",nil];
下面的使用时正确的
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
日常使用
- 判断数组元素是否为空
NSString *element = [array objectAtIndex:2];
if ((NSNull *)element == [NSNull null]) {
}
- 判断字典对象的元素是否为空
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"iPhone", @"First", @"iPad", @"Second", nil];
NSString *value = [dictionary objectForKey:@"First"];
if ((NSNull *)value == [NSNull null]) {
}
总结
参考文档
- Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同
- nil / Nil / NULL / NSNull ? 傻傻分不清楚
- ios nil、NULL和NSNull 的使用