1
NSNumber *x = [NSNumber numberWithBool:NO];
NSNumber *y = [NSNumber numberWithUnsignedInt:0];
assert([x isEqual:y]);
assert(x==y);

最初のアサーションは成功し、2 番目のアサーションは失敗します。なぜですか? それらの「objCType」が異なるためですか?isEqual: と == operator の定義の違いは何ですか?

なぜこれを行うのか: API が BOOL ではなく NSNumber を必要とするバックエンドにブール値を保存する必要があるため、保存する前にすべての BOOL を NSNumber に変換する必要があります。その逆も変換する必要があります。

4

1 に答える 1

5

==オペレーター_

演算子は==、ネイティブに型指定された値とオブジェクトポインターを比較して、それらが完全に同じであるかどうかを確認します。これは、2つのネイティブに型指定された値が等しいかどうかを確認する場合に役立ちます(1 == 1ここで、1はint)。また、2つのポインターが同じオブジェクトを指しているかどうかを確認することもできます。たとえば、これがある場合:

NSNumber *x = [NSNumber numberWithBool:NO];
NSNumber *y = x;

はと同じオブジェクトを指しているため、truex==yになります。xy

isEqual:方法_

このisEqual:メソッドは、2つを比較してNSObjects、それらが同じであるかどうかを確認しますが、必ずしも完全に同じオブジェクトであるとは限りません。「?と同じ[x isEqual:y]」と尋ねるのに対し、「?と同じオブジェクトを指している」と尋ねます。xyx==yxy

(を使用する*場合は、ポインターを宣言していることに注意してください。)

結論

ネイティブに型指定された値またはポインターを使用していないため、を使用する必要がありますisEqual:。このisEqual:メソッドは、オブジェクト自体ではなく、2つのオブジェクトの値を比較します。

また、[NSNumber numberWithBool:NO]実際[NSNumber numberWithUnsignedInt:0]には同じ値が生成されるため、isEqual:trueが返されます。

于 2012-11-01T12:53:17.477 に答える