nil / Nil / null / NSNull 全解

nil / Nil / NULL / NSNull 全解

???理解“不存在”的概念不僅僅是一個哲學(xué)的問題,也是一個實際的問題饥伊。我們是有形宇宙的居民殖属,而原因在于邏輯宇宙的存在不確定性。作為一個邏輯系統(tǒng)的物理體現(xiàn)潘悼,電腦面臨一個棘手的問題齐唆,就是如何用存在表達不存在嗤栓。

???在Objective-C中,有幾個不同種類的不存在箍邮。這樣做的原因要追溯到一個頻繁提及的NSHipster茉帅,講解Objective-C如何在C的程序范例以及由Smalltalk啟發(fā)的面向?qū)ο蟮姆独屑芷饦蛄旱摹?/p>

???C用0來作為不存在的原始值,而NULL作為指針(這在指針環(huán)境中相當于0)锭弊。 Objective-C在C的表達不存在的基礎(chǔ)上增加了nil担敌。nil是一個指向不存在的對象指針。雖然它在語義上與NULL不同廷蓉,但它們在技術(shù)上是相等的全封。

???在框架層面,F(xiàn)oundation定義了NSNull桃犬,即一個類方法+null刹悴,它返回一個單獨的NSNull對象。NSNull與nil以及NULL不同攒暇,因為它是一個實際的對象土匀,而不是一個零值。另外形用,在Foundation/NSObjCRuntime.h中就轧,Nil被定義為指向零的類指針。這個nil的鮮為人知的大寫的表兄并不常常出現(xiàn)田度,但它至少值得注意妒御。

關(guān)于 nil 的一些事

???剛被分配的NSObject的內(nèi)容被設(shè)置為0。也就是說那個對象所有的指向其他對象的指針都從nil開始镇饺,所以在init方法中設(shè)置self乎莉。(association) = nil之類的表達是沒有必要的。也許nil最顯著的行為是,它雖然為零惋啃,仍然可以有消息發(fā)送給它哼鬓。

???在其他的語言中,比如C++边灭,這樣做會使你的程序崩潰异希,但在Objective-C中,在nil上調(diào)用方法返回一個零值绒瘦。這大大的簡化了表達称簿,因為它避免了在使用nil之前對它的檢查:

// 舉個例子,這個表達椭坚。予跌。搏色。
if (name != nil && [name isEqualToString:@"Steve"]) { 
善茎。。频轿。
}
// …可以被簡化為:
if ([name isEqualToString:@"steve"]) {
垂涯。。航邢。
}

???了解nil如何在Objective-C中工作可以讓你將這個便利變成一個功能耕赘,而不是潛伏在你的應(yīng)用中的bug。要確保避免當nil值不需要的情況膳殷,要么通過檢查或者提前返回來安靜的失敗操骡,或者通過增加一個NSParameterAssert來拋出異常。

NSNull:有作沒有

???NSNull在Foundation和其它框架中被廣泛的使用赚窃,以解決如NSArray和NSDictionary之類的集合不能有nil值的缺陷册招。你可以將NSNull理解為有效的將NULL或者nil值封裝boxing,以達到在集合中使用它們的目的:

NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
//Sets value of NSNull singleton for "someKey"
mutableDictionary[@"someKey"] = [NSNull null]; 
//@[@"someKey"]
NSLog(@"Keys: %@", [mutableDictionary allKeys]);

對比

???總的來說勒极,這里的四個表達沒有的值是每個Objective-C程序員都應(yīng)該知道的是掰。

標志 含義 用途
NULL (void *)0 C指針的字面零值 “空指針” int *ponit = NULL; 它表示一個空指針
nil (id)0 Objective-C對象的字面零值 “空對象” object = nil,表示我想把這個對象釋放掉
Nil (Class)0 Objective-C類的字面零值 “空類" 用法和nil一樣辱匿,一般使用nil寫法
NSNull [NSNull null] 用來表示零值的單獨的對象 “值為空的對象” NSNull繼承自NSObject键痛,NSNull對象擁有一個有效的內(nèi)存地址,可以作為空值容器匾七。不能接受消息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末絮短,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昨忆,更是在濱河造成了極大的恐慌戚丸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異限府,居然都是意外死亡夺颤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門胁勺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世澜,“玉大人,你說我怎么就攤上這事署穗×攘眩” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵案疲,是天一觀的道長封恰。 經(jīng)常有香客問我,道長褐啡,這世上最難降的妖魔是什么诺舔? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮备畦,結(jié)果婚禮上低飒,老公的妹妹穿的比我還像新娘。我一直安慰自己懂盐,他們只是感情好褥赊,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莉恼,像睡著了一般拌喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俐银,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天尿背,我揣著相機與錄音,去河邊找鬼悉患。 笑死残家,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的售躁。 我是一名探鬼主播坞淮,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陪捷!你這毒婦竟也來了回窘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤市袖,失蹤者是張志新(化名)和其女友劉穎啡直,沒想到半個月后烁涌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡酒觅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年撮执,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舷丹。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡抒钱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颜凯,到底是詐尸還是另有隱情谋币,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布症概,位于F島的核電站蕾额,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏彼城。R本人自食惡果不足惜诅蝶,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望精肃。 院中可真熱鬧秤涩,春花似錦帜乞、人聲如沸司抱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽习柠。三九已至,卻和暖如春照棋,著一層夾襖步出監(jiān)牢的瞬間资溃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工烈炭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溶锭,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓符隙,卻偏偏與公主長得像趴捅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霹疫,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

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