Object-C中nil阶淘、Nil、NULL與NSNull的一些理解

相比于Java等其他編程語言互妓,在空指針溪窒、空值上,iOS開發(fā)中所用到Object-C語言的使用較為復(fù)雜冯勉,有nil澈蚌、Nil、NULL和NSNull多種情景可供使用灼狰,初學(xué)者很容易在它們之間產(chǎn)生混淆宛瞄。

定義區(qū)別

  • nil
    指向OC中對象的空指針;

  • Nil
    指向OC中類的空指針交胚;

  • NULL
    指向變量類型的空指針份汗;

  • NSNull
    在集合對象中盈电,表示空值的對象;

使用小結(jié)

  1. 從字面意義上理解杯活,nil是一個對象匆帚,而NULL是一個值,所以在調(diào)用對象方法時:[nil 任意方法] 返回NO轩猩,不會出現(xiàn)問題卷扮,這與Java等語言中經(jīng)典的NullPointerException空值異常大相徑庭;[NSNull 任意方法] 拋出異常甚至導(dǎo)致崩潰均践。常見用法:
NSURL *url = nil;
Class class = Nil摩幔;
int *pointerInt = NULL彤委;
  1. 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;

常見案例

  1. 下面一段代碼是常見的錯誤,release對象沒有設(shè)置為nil授翻,從而引起程序崩潰:
id someObject=[[Object alloc] init];
    //...
[someObject release];
    //...
if(someObject){ 
    //crash here
}
  1. 常見判空處理:
//判斷對象不空
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逞力,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子糠爬,更是在濱河造成了極大的恐慌寇荧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件执隧,死亡現(xiàn)場離奇詭異揩抡,居然都是意外死亡,警方通過查閱死者的電腦和手機镀琉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門峦嗤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屋摔,你說我怎么就攤上這事烁设。” “怎么了钓试?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵装黑,是天一觀的道長。 經(jīng)常有香客問我弓熏,道長恋谭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任挽鞠,我火速辦了婚禮疚颊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滞谢。我一直安慰自己串稀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布狮杨。 她就那樣靜靜地躺著母截,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橄教。 梳的紋絲不亂的頭發(fā)上清寇,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音护蝶,去河邊找鬼华烟。 笑死,一個胖子當(dāng)著我的面吹牛持灰,可吹牛的內(nèi)容都是我干的盔夜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喂链!你這毒婦竟也來了返十?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤椭微,失蹤者是張志新(化名)和其女友劉穎洞坑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝇率,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡迟杂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了本慕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排拷。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖间狂,靈堂內(nèi)的尸體忽然破棺而出攻泼,到底是詐尸還是另有隱情,我是刑警寧澤鉴象,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站何鸡,受9級特大地震影響纺弊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骡男,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一淆游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隔盛,春花似錦犹菱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龙亲,卻和暖如春陕凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳄炉。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工杜耙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拂盯。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓佑女,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子团驱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容