Objective-Cにおけるnil/Nil/NuLL/NSNull

3099 ワード

回転元:http://nshipster.cn/nil/
「存在しない」という概念を理解することは哲学の問題だけでなく、実際の問題でもある.私たちは有形宇宙の住民であり、論理宇宙の存在の不確実性が原因だ.論理システムの物理的体現として、コンピュータは1つの厄介な問題に直面して、どのように存在表現で存在しないかです.
Objective-Cにはいくつかの異なる種類が存在しない.その理由は頻繁に取り上げられるNSHipsterにさかのぼり,Objective-CがCのプログラム例とSmalltalkによって啓発されたオブジェクト向けの例にどのように橋を架けるかを説明する.
Cは、存在しない元の値として0、ポインタとしてNULLを用いる(これはポインタ環境では0に相当します。).
Objective-CはCの表現が存在しないことに基づいてnil増加した.nilは、存在しないオブジェクトを指すポインタです.意味的にはNULLとは異なるが、技術的には等しい.
フレームワークの面では、Foundationは、NSNull、すなわち、クラスメソッド+nullを定義し、NSNullオブジェクトを個別に返す.NSNullは、ゼロ値ではなく実際のオブジェクトであるため、nilおよび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でどのように動作するかを知ることで、アプリケーションに潜伏しているバグではなく、この便利さを機能に変えることができます.nilの値が不要な場合を避けるには、チェックまたは事前に戻ることによって静かな失敗を避けるか、NSParameterAssertを追加することによって異常を放出します.NSNull:作品はありますかNSNullは、NSArrayおよびNSDictionaryのような集合がnil値を有することができない欠陥を解決するために、Foundationおよび他のフレームワークにおいて広く使用されている.NSNullは、NULLまたはnilの値をboxingに効率的にカプセル化して、セット内でそれらを使用する目的を達成することができます.
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];

mutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for `someKey`

NSLog(@"Keys: %@", [mutableDictionary allKeys]); // @[@"someKey"]


総じて、ここの4つの表現にない値は、Objective-Cプログラマー一人一人が知っているはずです.
NULL(void*)0 Cポインタの文字列ゼロ値
Nil(id)0 Objective-Cオブジェクトの字面ゼロ値
Nil(Class)0 Objective-Cクラスの字面ゼロ値
NSNull[NSNull null]ゼロ値を表す個別のオブジェクト