objective-c -- nil/Nil/NULL/NSNull
4821 ワード
原文アドレスはこちら
「存在しない」という概念を理解することは哲学の問題だけでなく、実際の問題でもある.私たちは有形宇宙の住民であり、論理宇宙の存在の不確実性が原因だ.論理システムの物理的体現として、コンピュータは1つの厄介な問題に直面して、どのように存在表現で存在しないかです.
Objective-Cにはいくつかの異なる種類が存在しない.このような理由は、頻繁に言及されているNSHipsterにさかのぼり、Objective-CがどのようにCのプログラムの例とSmalltalkが啓発したオブジェクト向けの例に橋を架けるかを説明する.
Cは、存在しない元の値として
Objective-CはCの表現が存在しないことに基づいて
フレームワークの面では、Foundationは、
また、Foundation/NSobjCRuntime.hにおいて、
他の言語、例えばC++では、プログラムがクラッシュしますが、Objective-Cでは、
Objective-C
Objective-C
総じて、ここの4つの表現にない値は、Objective-Cプログラマー一人一人が知っているはずです.
ひょうしき
値
意味
NULL
(void *)0
Cポインタの文字列ゼロ値
nil
(id)0
Objective-Cオブジェクトの文字列ゼロ値
Nil
(Class)0
Objective-Cクラスの文字列ゼロ値
NSNull
[NSNull null]
ゼロ値を表す個別のオブジェクト
end~!
「存在しない」という概念を理解することは哲学の問題だけでなく、実際の問題でもある.私たちは有形宇宙の住民であり、論理宇宙の存在の不確実性が原因だ.論理システムの物理的体現として、コンピュータは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~!