iOS之NSNull/nil/Nil/NULL的區(qū)別

①NSNull
NSNull在 Foundation 和其它框架中被廣泛的使用,以解決如 NSArray和 NSDictionary之類(lèi)的集合不能有 nil值的缺陷。你可以將 NSNull理解為有效的將NULL 或者 nil 值封裝[boxing], 以達(dá)到在集合中使用它們的目的。
官方文檔解釋?zhuān)?br> A singleton object used to represent null values in collection objects that don’t allow nil values.
使用慣例:在 Foundation 集合對(duì)象(NSArray、NSDictionary、NSSet 等)中, nil 通常被用于表示集合對(duì)象結(jié)束的標(biāo)志,因此無(wú)法用 nil 來(lái)存儲(chǔ)一個(gè)空值,所以一般用 [NSNull null] 空對(duì)象來(lái)存儲(chǔ)。另外,在 NSDictionary 的 -objectForKey: 方法中,如果當(dāng)前字典中 key 對(duì)應(yīng)的值不存在時(shí),該方法會(huì)返回 nil,表明當(dāng)前 key 在字典中未添加,但是如果我們想明確表示某一 key 已經(jīng)在字典中添加,但是它沒(méi)有值,這時(shí)候就可以用 [NSNull null] 來(lái)賦值表示。

image.png

② nil
nil 定義在 usr/include/objc/objc.h 文件里:
image.png

其中 __has_feature(cxx_nullptr) 用于判斷當(dāng)前環(huán)境是否有 C++ 的 nullptr 特性,如果有,nil 定義為 nullptr,否則 nil 定義為 __DARWIN_NULL,所以在 Objective-C 中 nil 的最終定義為:

define nil ((void*)0)

也就是說(shuō),nil 本質(zhì)上也是:(void *)0,與 NULL 一致。
使用慣例:nil 用于表示指向 Objective-C 對(duì)象(id 類(lèi)型的對(duì)象,或者使用 @interface 聲明的 OC 對(duì)象)的指針為空,例如:


image.png

image.png

③Nil
Nil 定義在 usr/include/objc/objc.h 文件里:


image.png

與上述 nil 一致,Nil 本質(zhì)上也是:(void *)0。
使用慣例:Nil 用于表示指向 Objective-C 類(lèi)(Class)類(lèi)型的指針為空,例如:
image.png

image.png

④NULL
NULL 定義在 usr/include/sys/_types/_null.h 文件里:


image.png

其中 __DARWIN_NULL 的定義在 usr/include/sys/__types.h 文件里,如下:
image.png

上述代碼首先定義在 C++ 環(huán)境下不同編譯器的 __DARWIN_NULL 的取值,然后定了其他環(huán)境下 __DARWIN_NULL 的值,因此在 Objective-C 中 NULL 的最終定義為:

define NULL ((void*)0)

即 NULL 本質(zhì)上是:(void*)0。
使用慣例:NULL 一般用于表示 C 指針空值,例如:

image.png

NIL 或 NSNil
Objective-C 中不存在這兩個(gè)符號(hào)?。。?br> 總結(jié): 從上述分析我們可知,不管是 NULL、nil 還是 Nil,它們本質(zhì)上是一樣的,都是 (void *)0,只是寫(xiě)法不同。這樣做的意義是為了區(qū)分不同的數(shù)據(jù)類(lèi)型,雖然它們值相同,但我們需要理解它們之間的字面意義并用于不同場(chǎng)景,讓代碼更加明確,增加可讀性。
image.png

注:參考鏈接: http://ios.jobbole.com/89978/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容