(轉)nil / Nil / NULL / NSNull

理解“不存在”的概念不僅僅是一個哲學的問題,也是一個實際的問題涕蚤。我們是 有形 宇宙的居民,而原因在于邏輯宇宙的存在不確定性的诵。作為一個邏輯系統(tǒng)的物理體現万栅,電腦面臨一個棘手的問題,就是如何用 存在 表達 不存在 .

在 Objective-C 中西疤,有幾個不同種類的 不存在烦粒。這樣做的原因要追溯到一個頻繁提及的NSHipster,講解 Objective-C 如何在 C 的程序范例以及由 Smalltalk 啟發(fā)的面向對象的范例中架起橋梁的代赁。

C 用 0 來作為 不存在 的原始值扰她,而 NULL 作為指針(這在指針環(huán)境中相當于0)。

Objective-C 在 C 的表達 不存在 的基礎上增加了 nil芭碍。nil 是一個指向不存在的 對象 指針徒役。雖然它在語義上與 NULL 不同,但它們在技術上是相等的窖壕。

在框架層面忧勿,Foundation 定義了 NSNull,即一個類方法 +null瞻讽,它返回一個單獨的 NSNull 對象鸳吸。NSNullnil 以及 NULL 不同,因為它是一個實際的對象速勇,而不是一個零值晌砾。

另外,在 Foundation/NSObjCRuntime.h 中烦磁,Nil 被定義為指向零的 指針养匈。這個nil的鮮為人知的大寫的表兄并不常常出現,但它至少值得注意个初。

關于 nil 的一些事

剛被 分配NSObject內容被設置為0乖寒。也就是說那個對象所有的指向其他對象的指針都從 nil 開始,所以在 init 方法中設置 self.(association) = nil 之類的表達是沒有必要的院溺。

也許 nil 最顯著的行為是楣嘁,它雖然為零,仍然可以有消息發(fā)送給它珍逸。

在其他的語言中逐虚,比如 C++,這樣做會使你的程序崩潰谆膳,但在 Objective-C 中叭爱,在 nil 上調用方法返回一個零值。這大大的簡化了表達漱病,因為它避免了在使用 nil 之前對它的檢查:

// 舉個例子买雾,這個表達...
if (name != nil && [name isEqualToString:@"Steve"]) { ... }

// …可以被簡化為:
if ([name isEqualToString:@"steve"]) { ... }

了解 nil 如何在 Objective-C 中工作可以讓你將這個便利變成一個功能把曼,而不是潛伏在你的應用中的 bug。要確保避免當 nil 值不需要的情況漓穿,要么通過檢查或者提前返回來安靜的失敗嗤军,或者通過增加一個 NSParameter<wbr style="box-sizing: border-box;">Assert 來拋出異常。

NSNull:有作沒有

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

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


總的來說僚饭,這里的四個表達 沒有 的值是每個 Objective-C 程序員都應該知道的:

標志 含義
NULL (void *)0 C指針的字面零值
nil> (id)0 Objective-C對象的字面零值
Nil (Class)0 Objective-C類的字面零值
NSNull [NSNull null] 用來表示零值的單獨的對象

原文鏈接:nil / Nil / NULL / NSNull

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末震叮,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子鳍鸵,更是在濱河造成了極大的恐慌苇瓣,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权纤,死亡現場離奇詭異钓简,居然都是意外死亡,警方通過查閱死者的電腦和手機汹想,發(fā)現死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門外邓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人古掏,你說我怎么就攤上這事损话。” “怎么了槽唾?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵丧枪,是天一觀的道長。 經常有香客問我庞萍,道長拧烦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任钝计,我火速辦了婚禮恋博,結果婚禮上,老公的妹妹穿的比我還像新娘私恬。我一直安慰自己债沮,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布本鸣。 她就那樣靜靜地躺著疫衩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荣德。 梳的紋絲不亂的頭發(fā)上闷煤,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天童芹,我揣著相機與錄音,去河邊找鬼鲤拿。 笑死辐脖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的皆愉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼艇抠,長吁一口氣:“原來是場噩夢啊……” “哼幕庐!你這毒婦竟也來了?” 一聲冷哼從身側響起家淤,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤异剥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后絮重,有當地人在樹林里發(fā)現了一具尸體冤寿,經...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年青伤,在試婚紗的時候發(fā)現自己被綠了督怜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狠角,死狀恐怖号杠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情丰歌,我是刑警寧澤姨蟋,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站立帖,受9級特大地震影響眼溶,放射性物質發(fā)生泄漏。R本人自食惡果不足惜晓勇,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一堂飞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宵蕉,春花似錦酝静、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稼稿,卻和暖如春薄榛,著一層夾襖步出監(jiān)牢的瞬間讳窟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工敞恋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丽啡,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓硬猫,卻偏偏與公主長得像补箍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啸蜜,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361