①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)賦值表示。

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

其中 __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ì)象)的指針為空,例如:


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

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


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

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

上述代碼首先定義在 C++ 環(huán)境下不同編譯器的 __DARWIN_NULL 的取值,然后定了其他環(huán)境下 __DARWIN_NULL 的值,因此在 Objective-C 中 NULL 的最終定義為:
define NULL ((void*)0)
即 NULL 本質(zhì)上是:(void*)0。
使用慣例:NULL 一般用于表示 C 指針空值,例如:

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

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