私はここSOでいくつかの質問を見ましたisEqual:
が、標準の代わりに関数を含む回答があります==
。
これまでのところ、私はを使用することを学んだだけ==
なので、何を使用するのが良いのか、それぞれの長所と短所は何ですか?いつ使うべきですか?
ありがとうございました。
私はここSOでいくつかの質問を見ましたisEqual:
が、標準の代わりに関数を含む回答があります==
。
これまでのところ、私はを使用することを学んだだけ==
なので、何を使用するのが良いのか、それぞれの長所と短所は何ですか?いつ使うべきですか?
ありがとうございました。
彼らは異なることをします。したがって、適切なものを使用する必要があります。
次のことを検討してください。
NSString *a = @"Hello!";
NSString *b = a;
NSString *c = [a mutableCopy];
if (a == b) NSLog(@"This prints");
if (b == c) NSLog(@"This doesn't");
if ([a isEqual:c]) NSLog(@"This does");
言い換えると; ==
2つのポインタが同じ場所を指しているかどうか、つまり同じオブジェクトであるかどうかを確認するだけです。isEqual:
2つのオブジェクトが等しいかどうかをチェックします。この場合a
、とb
は同じ文字c
列ですが、はと等しい新しい文字列でa
あり、同じ文字が同じ順序で含まれています。しかし、それは異なるクラスと異なるアドレスを持っています。
ほとんどの場合、オブジェクトに使用する必要があります。オブジェクトがある場合は、同じクラス(たとえば)isEqual:
の場合は、より具体的なコンパレータを使用します。isEqualToString:
==
一方、おそらく整数データ型にのみ使用する必要があります。(オブジェクトにはほとんど意味がなく、浮動小数点数にはあまり意味がありません。)
isEqualは、レシーバーオブジェクト用に記述されたメソッドに従ってオブジェクトを比較します
==オブジェクトのアドレス(またはintなどのC型変数の値)を比較します
これは、たとえばNSStrings ==がアドレスを比較するが、isEquals:は文字列オブジェクトの値を調べるため、strcmpと同様のことを行うことを意味します。
多くの文字列は、データが同じである場合にアドレスが同じになるようにインターンされているため、テストケースで==が機能しているように見えることに注意してください。