Objective-C 中nil/Nil/NULL/NSNull

來源:互聯網
上載者:User

標籤:http   io   ar   os   使用   sp   for   on   問題   

轉自:http://nshipster.cn/nil/

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

在Objective-C中,有幾個不同種類的不存在。這樣做的原因要追溯到一個頻繁提及的NSHipster,講解Objective-C如何在C的程式範例以及由Smalltalk啟發的物件導向的範例中架起橋樑的。

C用0來作為不存在的原始值,而NULL作為指標(這在指標環境中相當於0)。

Objective-C在C的表達不存在的基礎上增加了nilnil是一個指向不存在的對象指標。雖然它在語義上與NULL不同,但它們在技術上是相等的。

在架構層面,Foundation定義了NSNull,即一個類方法+null,它返回一個單獨的NSNull對象。NSNullnil以及NULL不同,因為它是一個實際的對象,而不是一個零值。

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

關於 nil 的一些事

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

也許nil最顯著的行為是,它雖然為零,仍然可以有訊息發送給它。

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

// 舉個例子,這個表達...if (name != nil && [name isEqualToString:@"Steve"]) { ... }// …可以被簡化為:if ([name isEqualToString:@"steve"]) { ... }

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

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]
用來表示零值的單獨的對象

Objective-C 中nil/Nil/NULL/NSNull

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.