これは私がそれを見たコンテキストです:
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
[controllers addObject:[NSNull null]];
}
その場所でnilしないのはなぜですか?
Apple から直接:
NSNullクラスは、nilが値として禁止されている状況(通常、配列や辞書などのコレクションオブジェクト)でnull値を表すために使用するシングルトンオブジェクトを定義します。
したがって、あなたの例では、それがまさに何が起こっているのか、プログラマーはnullオブジェクトをコントローラー配列に入れることを選択しています。ここで、nilは値として許可されていません。
nil
値をNSArray
またはNSMutableArray
に追加することはできません。 nil
値を保存する必要がある場合は、そのスニペットに示すように、NSNull
ラッパークラスを使用する必要があります。これは documentation で指定されています。
NSArray
やNSDictionary
などのコレクションクラスには、nil
値を含めることはできません。 NSNULL
は特にnil
のプレースホルダーとして作成されました。これはコレクションクラスに入れることができますで、スペースのみを使用します。
NSNull
はシングルトンオブジェクトを定義します。つまり、NSNull([NSNull null]
を使用して作成する)のインスタンスは1つしかありませんが、必要なだけ多くの場所で使用できます。
上記で詳述したように、[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]
NSNullクラスは、nilが値として禁止されている状況(通常、配列や配列などのコレクションオブジェクト)でnull値を表すために使用するシングルトンオブジェクトを定義します辞書)。
NSArrayまたはNSMutableArrayにnil値を追加することはできません。 nil値を格納する必要がある場合は、NSNullラッパークラスを使用する必要があります。
NSArrayやNSDictionaryなどのコレクションクラスにnil値を含めることはできません。 NSNULLは、特にnilのプレースホルダーとして作成されました。コレクションクラスに入れることができ、スペースのみを使用します。
参照用のリンクを参照してください