0

Sender クラスと送信者オブジェクトを作成しました。

Sender *sender = [[Sender alloc] init];

次に、テストを書きました:

// should success
[sender upload:[UIImage imageNamed:@"test2.jpg"] withName:@"test2.jpg"];
// should fail
[sender upload:nil withName:@"test2.jpg"];

次に、nil チェック コードを書きました。

- (void)upload:(UIImage *)image withName:(NSString *)name
{
    if ([image isEqual:nil]) {
        ...
    }
    ...
}

ただし、nil チェックは無視されます。image パラメータが nil かどうかを確認するにはどうすればよいですか? ご親切にありがとうございました。

4

3 に答える 3

3

試す

if(!image)

また

if(image == nil)
于 2012-10-29T01:32:08.177 に答える
2

短い答え、に置き換え[image isEqual:nil]ますimage == nil

あなたが書くときの長い答え:

[image isEqual:nil]

isEqual:参照が variable に格納されているオブジェクトにメッセージを送信するように求めていますimage

ただし、オブジェクトにメッセージを送信したくない場合は、変数imageにオブジェクトへの参照が含まれているかどうかを判断したいと考えています。これを行うには、参照の値を「参照なし」のと比較する必要があります-これは書かれていnilます. Objective-C (および C など) の値比較演算子は次の==ようにテストする必要があります。

image == nil

ここで、メッセージを送信するオブジェクトがないのに、なぜコードがエラーなしで実行され、期待した結果が得られなかったのかと疑問に思うかもしれません。Objective-C は、「オブジェクトなし」、別名 へのメッセージの送信をサポートし、結果タイプの「ゼロ」値、nilつまりなどを返します。ステートメントのようにブール値に変換すると、「ゼロ」値が生成されます。0nilifNO

HTH

于 2012-10-29T02:08:19.567 に答える
1

@yeesterbunny の回答は、この状況で何をすべきかについて適切ですが、その理由を知っておくとよいでしょう。

すべての objc メソッド呼び出しはメッセージであることを思い出してください。電話すると

[objA isEqual:objB]

objA に、それ自体が objB と「等しい」と見なすかどうかを尋ねるメッセージを送信しています。

メソッドの「image」パラメーターが nil の場合、メッセージを送信する対象はありません。定義により、nil へのメッセージはすべて nil を返します。(そして、「nil」は if ステートメントのゼロと同じです。)

話の教訓: nil を探している場合は、ポインターの等価性を == (または !=、または "if (!image)" のように暗黙的に) でテストします。isEqual: を使用するのは、2 つのオブジェクト (存在することがわかっている類似の型) が意味的に等しいかどうかをテストする場合 (たとえば、NSString の 2 つのインスタンスに同じテキストが含まれているかどうかを知りたい場合) だけです。

于 2012-10-29T03:08:32.067 に答える