NSObject
を提供しisEqual:
、すべてのオブジェクトがの子孫である場合NSObject
、簡単な答えは、デフォルトの実装が提供されるということです。
ここで、このデフォルトで使用されるアルゴリズムについて懸念があり、コメントに「テストするだけではわかりません」と記述します。楽しみのために、テストを見てみましょう;-)
isEqual:
Appleがそのセマンティクスを変更することを決定した場合、結果は重大で良くない可能性があるため、これはかなり基本的な方法です。したがって、Appleはセマンティクスが同じであれば、実装方法を自由に変更できます。つまり、変更後も以前と同じオブジェクトが同等に比較されます。isEqual:
ここで、3つの可能なアルゴリズムを使用できると述べました。
- ポインタの比較-まったく同じオブジェクトですか
- 浅い比較-オブジェクトのフィールドは直接比較された同じ値を持っていますか
- 深い比較-直接比較された非ポインター値フィールドは同じ値を持ち、ポインター値フィールドは以下を使用して等しく比較されますか
isEqual:
これらはすべて異なるセマンティクスを持っていますが、Appleが選択したものはどれでも、多くのコードを壊さずに変更することはできません。そして、異なるセマンティクスは、テストできることを意味します...
入力時にコーディングすると、エラーが予想されます。重要なビットのみが含まれています:
@implementation A
- (BOOL) isEqual:(id)other
{
NSLog(@"A.isEqual called");
return self == other; // true iff same object
}
@end
@interface B
@property (readwrite) int anInteger;
@property (readwrite) A *anA;
@end
@implementation B
@synthesize anInteger, anA;
@end
// Let's test the algorithm
A *myA = [A new];
B *bOne = [B new];
B *bTwo = [B new];
bOne.anInteger = 42;
bOne.anA = myA;
bTwo.anInteger = 42;
bTwo.anA = myA;
// What output is produced (all of it!)
NSLog(@"[bOne isEqual:bTwo] -> %@", [bOne isEqual:bTwo] ? @"Yes" : @"No");
HTH少し。