web-dev-qa-db-ja.com

[NSNull null]とnilの違いは何ですか?

これは私がそれを見たコンテキストです:

NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]];
}

その場所でnilしないのはなぜですか?

46
Thanks

Apple から直接:

NSNullクラスは、nilが値として禁止されている状況(通常、配列や辞書などのコレクションオブジェクト)でnull値を表すために使用するシングルトンオブジェクトを定義します。

したがって、あなたの例では、それがまさに何が起こっているのか、プログラマーはnullオブジェクトをコントローラー配列に入れることを選択しています。ここで、nilは値として許可されていません。

81
Mike Caron

nil値をNSArrayまたはNSMutableArrayに追加することはできません。 nil値を保存する必要がある場合は、そのスニペットに示すように、NSNullラッパークラスを使用する必要があります。これは documentation で指定されています。

12
hbw

NSArrayNSDictionaryなどのコレクションクラスには、nil値を含めることはできません。 NSNULLは特にnilのプレースホルダーとして作成されました。これはコレクションクラスに入れることができますで、スペースのみを使用します。

NSNullはシングルトンオブジェクトを定義します。つまり、NSNull([NSNull null]を使用して作成する)のインスタンスは1つしかありませんが、必要なだけ多くの場所で使用できます。

9
Rose Perrone

上記で詳述したように、[NSNull null]はオブジェクトが必要なプレースホルダーとして有用であることに私たちは皆同意します。しかし、オブジェクトの割り当てで明示的に使用されていない限り、これを比較して使用することはできません。これは、私が過去に犯した間違いです。

id a;
NSLog(@"Case 1");
if (a == nil) NSLog(@"a == nil");
if (a == Nil) NSLog(@"a == Nil");
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

NSLog(@"Case 2");
a = [NSNull null];
if (a == nil) NSLog(@"a == nil");
if (a == Nil) NSLog(@"a == Nil");
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

出力:

2014-01-31 10:57:11.179 MCDocsApp [13266:a0b]ケース1

2014-01-31 10:57:11.179 MCDocsApp [13266:a0b] a == nil

2014-01-31 10:57:11.179 MCDocsApp [13266:a0b] a ==なし

2014-01-31 10:57:11.180 MCDocsApp [13266:a0b]ケース2

2014-01-31 10:57:11.180 MCDocsApp [13266:a0b] isEqual:[NSNull null]

8
Hampden123

NSNullクラスは、nilが値として禁止されている状況(通常、配列や配列などのコレクションオブジェクト)でnull値を表すために使用するシングルトンオブジェクトを定義します辞書)。

NSArrayまたはNSMutableArrayにnil値を追加することはできません。 nil値を格納する必要がある場合は、NSNullラッパークラスを使用する必要があります。

NSArrayやNSDictionaryなどのコレクションクラスにnil値を含めることはできません。 NSNULLは、特にnilのプレースホルダーとして作成されました。コレクションクラスに入れることができ、スペースのみを使用します。

参照用のリンクを参照してください

https://developer.Apple.com/library/content/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html

0
Suraj K Thomas