3

この質問の 2 つの部分

1) 何が起こっているかについてのこの理解は正しいですか?
「if (obj)」は、ポインターが 0x0 ではないかどうかをテストしています。つまり、整数メモリ アドレスに設定されています
。「if (obj != nil)」は、オブジェクトのメモリ アドレスをユニバーサル nil オブジェクトのメモリ アドレスと比較しています。

2) したがって、変数が何かを指しているかどうかがわからない状況では、もしそうであれば、そのオブジェクトが有効なオブジェクトか nil かどうかもわかりません。objにメッセージを渡すだけでなく、その情報に基づいてさまざまなことをしたいのですが、nilであれば安全だと思います。このコードは正しく、必要ですか?

if (obj && obj != nil) {
    // Do a bunch of things that should only happen if obj is pointing to a valid object
    [obj someMessage];
    [anotherObj someOtherMessage];
}

みんなありがとう!

4

5 に答える 5

17

正しい?はい。必要?いいえ。Objective-C は単純に に#definesnil(void *)0ます。これは、C の用語では false です。だから簡単に書くと

if (obj) {
    [obj someMessage];
    [anotherObj someOtherMessage];
}

十分なものです。さらに、Objective-C には message-eating があるnilため、場合によっては単純にチェックを省略できます。(たとえば、ブロック内に 2 行目がなければ、単純に無差別ifに呼び出すことができます。)[obj someMessage]

于 2009-11-18T20:33:30.630 に答える
12

これは、期待どおりの結果が得られるという意味では正しいですが、冗長です。次を使用するだけで十分です。

if (obj) {

また

if (obj != nil) {
于 2009-11-18T20:31:32.060 に答える
4

を簡単に使用できますif (obj)。によるとobjc.hnil#defineです__DARWIN_NULL。を調べてみると、プラットフォームと、C または C++ コンパイラのどちらを使用しているかに応じて、 、、またはとして定義されていることが/usr/include/sys/_types.hわかります。しかし、最終的には常に false と評価されるため、単純なもので十分です。__DARWIN_NULL0L0(void *)0nilif (obj)

于 2009-11-18T20:37:26.957 に答える
4

あなたの質問に対する直接的な回答ではなく、パート 2 で示唆されているような質問に対する回答です。メッセージを送信して、それが意図したとおりに動作するかどうかを確認する以外に、ポインターが「有効なオブジェクト」を参照しているかどうかを判断する方法はありません。nil ではないが、ほとんどの目的で「有効なオブジェクト」と見なされないものは、あらゆる種類のものがあります。たとえば、オブジェクト変数は次を指す場合があります。

  • 割り当て解除されたオブジェクトが存在していたガベージ スペース
  • 変数が指すはずのオブジェクトの代わりに割り当てられた新しいオブジェクト
  • 誤って変数に設定した int
  • NSString の代わりに誤って変数を設定した AC 文字列

これらのいずれかが当てはまるかどうかを実行時にテストする方法はありません。コードに、変数をそのような状態にするバグがないことを確認する必要があります。

于 2009-11-18T20:48:53.703 に答える
0

if (obj == nil) then if (obj) は false と評価されます。両方は必要ありません。

于 2009-11-18T20:32:38.183 に答える