nil、null、[nsnull nil]の違いは何ですか?
-
25-10-2019 - |
質問
このようなエラーがありました - *猛攻撃の例外によるアプリの終了「nsinvalidargumentexception」、理由:** - [nscfdictionary initwithobjects:forkeys:count:]:objects [0](key:searched)にnil値を挿入しようとする
次に、以下のコードを試しました
if (Obj == (id)[NSNull null]) //Obj is an id
{
NSLog(@" Obj is (id)[NSNull null]");
}
else if (Obj == nil)
{
NSLog(@"Obj is nil");
}
else if (Obj == NULL)
{
NSLog(@"Obj is NULL");
}
else
{
NSLog(@"Obj is something else");
}
searchedDict = [NSDictionary dictionaryWithObject:Obj forKey:@"searched"];
そして、「OBJはnil」としてnslogメッセージを受け取りました。
しかし、OBJがnsStringであり、nil値のためにアプリが終了したときに上記のコードを使用したとき、nslogメッセージを「obj is(id)[nsnull null]」として受け取りました。
nil、null、[nsnull nil]の違いは何ですか?
異なる種類のヌル値はありますか?はいの場合、これらのヌル値をよく確認する方法?
ありがとう :-)
解決
NULL
ポインターに与えられた元のCスタイルの値は、明示的なアドレスを指しないとみなされるとみなされます。それは通常、「絶えず」または センチネルの価値.
char * oldstring = NULL;
nil
OBJ-Cオブジェクト参照に適用されるのと同じもののObjective-Cバージョンです。
NSString * str = nil;
id foo = nil;
どちらも値ゼロに等しいと定義されていますが、あなたは できる それらを交換可能に使用すると、前者は主に従来のポインターのためにOBJ-C内で見られます(設定など void *
nullへのコンテキストポインター)および nil
すべてのOBJ-Cオブジェクト参照に使用されます。
違いは存在します。OBJ-Cの構文はたまたまCの上に乗っていますが、言語の設計は高レベルであり、そのオブジェクトIDは 概念的には同じではありません 単に「ポインター」として。したがって、彼らのための特別なセンチネルの作成。
[NSNull null]
オブジェクトです それは意図されています 「非価値」値が望まれているが実際の非常に特定の場合(コレクションへの挿入など)に使用すること nil
許可されておらず、オブジェクトを使用する必要があります。
ご了承ください nil
と NSNull
非常に同様にstringify: nil
Stringifies as (null)
, 、 と NSNull
なので <null>
.
他のヒント
[NSNull null]
のラッパーです nil
コレクションに挿入したい値は、それがあなたが望むものであれば。
nsnull クラス参照。
オブジェクト参照が前に確認することもできます nil
単に ==
.
また nil
と定義されている : #define nil NULL
cに相当する客観的なc NULL
.
nilはオブジェクトポインター用です
ヌルは非ポインター用です
nsnull null]は、nil値が許可されていない場合に使用する「nil」を表すオブジェクトです(ヴィンスが指摘したように、コレクションなどのnsarrayやnsdictionaryのように)