2009-05-13 3 views
11

私はこれを見てきました:これは何ですか(NSNull *)コントローラ== [NSNull null]する必要がありますか?コントローラ== nilだけではないのはなぜですか?アップルの例では

myController *controller = [viewControllers objectAtIndex:page]; 
if ((NSNull *)controller == [NSNull null]) { 
    controller = [[myController alloc] initWithPageNumber:page]; 
    [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    [controller release]; 
} 

私はこのラインで非常に興味があります:私はそれをやっているだろう場合は、私はちょうどゼロのためにチェックしているだろう

if ((NSNull *)controller == [NSNull null]) { 

。なぜ彼らはそれほど複雑なことをするのだろうか?それは実際に何をしているのですか?私にとっては、コントローラオブジェクトをNSNullにキャストしているように見え、それがNSNullからのnullと同じかどうかを確認します。

A.F.A.I.K. nilは "no object"を意味し、nullは "nothing"を意味します。私はここで明確な画像を取得するのを手伝ってください!

答えて

12

ほとんどのコンテナでは、 'nil'オブジェクトを挿入できません。実際にコンテナにnull値を挿入する場合は、NSNullインスタンスを使用できます(NSNullはシングルトンです)。

特定の例では、コントローラはアレイからフェッチされます。次に、オブジェクトがNSNullインスタンスでないことを確認することをお勧めします。

+0

ありがとうございました。だから(NSNull *)コントローラはNSNullにコントローラをキャストしていますか?私は、isKindOfClass演算子などがあると考えました。 – Thanks

+0

ポインタの比較を行うのは、isKindOfClassを呼び出すよりも(実行時に)迅速ですが、[controller isEqual:[NSNull null]]と同じように動作するはずです。 コントローラが 'id'であると宣言した場合、コンパイラの警告を避けるためにキャストは必要ありません。 –

1

NSArrayNSDictionaryなどのコレクションクラスには、nilの値を含めることはできません。あなたのivar、viewControllerは、コレクションクラスのインスタンスです。 NSNULLは、具体的にはnilのプレースホルダとして作成され、コレクションクラスに配置できます。

NSNullクラスがそこ(あなたが[NSNull null]を使用して作成)NSNullの単一のインスタンスがしかのですが、あなたが望むように、それはできるだけ多くの場所で使用できることを意味シングルトンオブジェクトを定義します。

関連する問題