C用0來做爲不存在的原始值,而NULL做爲指針(這在指針環境中至關於0)。框架
Objective-C在C的表達不存在的基礎上增長了nil。nil是一個指向不存在的對象指針。雖然它在語義上與NULL不一樣,但它們在技術上是相等的。指針
在框架層面,Foundation定義了NSNull,即一個類方法+null,它返回一個單獨的NSNull對象。NSNull與nil以及NULL不一樣,由於它是一個實際的對象,而不是一個零值。code
另外,在Foundation/NSObjCRuntime.h中,Nil被定義爲指向零的類指針。這個nil的不爲人知的大寫的表兄並不經常出現,但它至少值得注意。對象
關於nil:ci
剛被分配的NSObject的內容被設置爲0。也就是說那個對象全部的指向其餘對象的指針都從nil開始,因此在init方法中設置self.(association) = nil之類的表達是沒有必要的。it
也許nil最顯著的行爲是,它雖然爲零,仍然能夠有消息發送給它。io
在其餘的語言中,好比C++,這樣作會使你的程序崩潰,但在Objective-C中,在nil上調用方法返回一個零值。這大大的簡化了表達,由於它避免了在使用nil以前對它的檢查:table
// 舉個例子,這個表達... if (name != nil && [name isEqualToString:@"Steve"]) { ... } // …能夠被簡化爲: if ([name isEqualToString:@"steve"]) { ... }
關於NSNull:
class
NSNull在Foundation和其它框架中被普遍的使用,以解決如NSArray和NSDictionary之類的集合不能有nil值的缺陷。你能夠將NSNull理解爲有效的將NULL或者nil值封裝boxing,以達到在集合中使用它們的目的:基礎
NSMutableDictionary *mDic = [[NSMutableDictionary alloc]init]; mDic[@"someKey"] = [NSNull null]; NSLog(@"key :%@",[mDic allKeys]); NSLog(@"dic :%@",mDic);
輸出:
key :( someKey ) dic :{ someKey = "<null>"; }
總結一下:
NULL (void *)0 C指針的字面零值
nil (id)0 Objective-C對象的字面零值
Nil (Class)0 Objective-C類的字面零值
NSNull [NSNull null] 用來表示零值的單獨的對象