定义区别
nil
指向OC中对象的空指针;Nil
指向OC中类的空指针;NULL
指向变量类型的空指针;NSNull
在集合对象中,表示空值的对象;
使用小结
从字面意义上理解,nil是一个对象,而NULL是一个值,所以在调用对象方法时:[nil 任意方法]
返回NO,不会出现问题,这与Java等语言中经典的NullPointerException空值异常大相径庭;[NSNull 任意方法]
抛出异常甚至导致崩溃。
常见用法:
NSURL *url = nil;
Class class = Nil;int *pointerInt = NULL;
NSNULL,NULL和nil在本质上应该是一样的,NULL和nil其实就是0,但是在Objective-c中,对于像NSArray这样的 类型,nil或NULL不能做为加到其中的Object,如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用 [NSNULL null返回的对对象来初始化NSArray中的内容。因为在集合对象如NSArray和NSDictionary中nil中有特殊的含义(表示列表结 束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类,能起到占位符的作用。NSNull只有一个 方法:
+ (NSNull *) null;
常见案例
下面一段代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃:
id someObject=[[Object alloc] init]; //...[someObject release]; //...if(someObject){ //crash here}
常见判空处理:
//判断对象不空if(object) {}//判断对象为空if(object == nil) {}//数组初始化,空值结束NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil];//判断数组元素是否为空UIViewController *controller=[NSArray objectAtIndex:i];if((NSNull *)controller == [NSNull null]){ //}//判断字典对象的元素是否为空NSString *userId=[NSDictionary objectForKey:@"UserId"];if(userId == [NSNull null]){ //}
最后通过集合对象中占位符来加深一下理解:
NSObject *obj1 = [[NSObject alloc] init];NSObject *obj2 = [NSNull null];NSObject *obj3 = [NSObject
**new
**];NSObject *obj4;NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];NSLog(@"arr1 count: %ld", [arr1 count]); //count: 3 因为obj=nil,在加入obj4时就结束添加对象NSObject *obj1;NSObject *obj2 = [[NSObject alloc] init];NSObject *obj3 = [NSNull null];NSObject *obj4 = [NSObject
**new
**];NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];NSLog(@"arr2 count: %ld", [arr2 count]); //count: 0,因为obj1=nil,所以后面的对象没有添加进去[NSNull null]通常作为占位符作用,如下:NSObject *obj1 = [NSNull null];NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];
**for** (NSString *str in arr1) {NSLog(@"array object: %@", str);
} //result:One、Two、、threeNSObject *obj1 = [NSNull null];NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];
**for** (NSString *str in arr1) {
**if** (str != [NSNull null]){NSLog(@"array object: %@", str);
}
}//result:One、Two、three