objective-c -- nil/Nil/NULL/NSNull


原文アドレスはこちら
「存在しない」という概念を理解することは哲学の問題だけでなく、実際の問題でもある.私たちは有形宇宙の住民であり、論理宇宙の存在の不確実性が原因だ.論理システムの物理的体現として、コンピュータは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を使用する前にその検査を回避するため、表現を大幅に簡略化します.
Objective-C
//     ,    ...
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にカプセル化して、セットで使用する目的を達成することができます.
Objective-C
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]
ゼロ値を表す個別のオブジェクト
end~!