相比于Java等其他編程語言互妓,在空指針溪窒、空值上,iOS開發(fā)中所用到Object-C語言的使用較為復(fù)雜冯勉,有nil澈蚌、Nil、NULL和NSNull多種情景可供使用灼狰,初學(xué)者很容易在它們之間產(chǎn)生混淆宛瞄。
定義區(qū)別
nil
指向OC中對象的空指針;Nil
指向OC中類的空指針交胚;NULL
指向變量類型的空指針份汗;NSNull
在集合對象中盈电,表示空值的對象;
使用小結(jié)
- 從字面意義上理解杯活,nil是一個對象匆帚,而NULL是一個值,所以在調(diào)用對象方法時:
[nil 任意方法]
返回NO轩猩,不會出現(xiàn)問題卷扮,這與Java等語言中經(jīng)典的NullPointerException空值異常大相徑庭;[NSNull 任意方法]
拋出異常甚至導(dǎo)致崩潰均践。常見用法:
NSURL *url = nil;
Class class = Nil摩幔;
int *pointerInt = NULL彤委;
- NSNULL,NULL和nil在本質(zhì)上應(yīng)該是一樣的或衡,NULL和nil其實就是0焦影,但是在Objective-c中,對于像NSArray這樣的類型封断,nil或NULL不能做為加到其中的Object斯辰,如果定義了一個NSArray,為其分配了內(nèi)存坡疼,又想設(shè)置其中的內(nèi)容為空彬呻,則可以用[NSNULL null返回的對對象來初始化NSArray中的內(nèi)容。因為在集合對象如NSArray和NSDictionary中nil中有特殊的含義(表示列表結(jié)束)柄瑰,所以不能在集合中放入nil值闸氮。如要確實需要存儲一個表示“什么都沒有”的值,可以使用NSNull類教沾,能起到占位符的作用蒲跨。NSNull只有一個方法:
+ (NSNull *) null;
常見案例
- 下面一段代碼是常見的錯誤,release對象沒有設(shè)置為nil授翻,從而引起程序崩潰:
id someObject=[[Object alloc] init];
//...
[someObject release];
//...
if(someObject){
//crash here
}
- 常見判空處理:
//判斷對象不空
if(object) {}
//判斷對象為空
if(object == nil) {}
//數(shù)組初始化或悲,空值結(jié)束
NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil];
//判斷數(shù)組元素是否為空
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時就結(jié)束添加對象
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捌臊、、three
NSObject *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