iOS 開發 nil/Nil/NULL/NSNull的區別

    C用0來做爲不存在的原始值,而NULL做爲指針(這在指針環境中至關於0)。框架

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

    在框架層面,Foundation定義了NSNull,即一個類方法+null,它返回一個單獨的NSNull對象。NSNull與nil以及NULL不一樣,由於它是一個實際的對象,而不是一個零值。code

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

    關於nilci

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

相關文章
相關標籤/搜索