0

C には、等価演算子のデフォルトの実装があります。すべてのメンバーを調べて、等値演算子を満たしていることを確認します。オブジェクトにポインターが含まれている場合、メンバーの等値演算子がポインターに対して実行されるため、デフォルトはややばかげています。

それでも、私の目的には十分です。

そうですか?

または、isEqual を使用する可能性があるカスタム オブジェクトを作成するたびに、isEqual と対応するハッシュを実装する必要があります。

「デフォルト」の実装は、メンバーではなくオブジェクトのポインターを単純に比較することだと思われます。私はここで正しいですか?C++ の標準比較よりもさらに悪いです。検証したいところです。

私たちのクラスが NSObject の直接の子である場合、 isEqual は単に親の isEqual を呼び出し、ポインターを比較するだけです。

私はここで正しいですか?私はそれを確かめたいだけです。

4

3 に答える 3

2

Apple がドキュメントをプロトコルとインターフェイスの間で分離する方法のため、少し混乱します。

@protocol NSObject

- (BOOL)isEqual:(id)object;

これは実装する必要があるメソッドであるため、NSObject (クラス) はこれを確実に実装しますが、apples dev サイトのクラス定義を見てもわかりません。これは、xcode のヘッダーから直接取得されます。

一般に、カスタム isEqual を実装しないと、ポインター ID のみを取得することが期待され、多くの場合は問題ありません。ハッシュや isEqual などの特定の機能の特異性に関係なく、一意のインスタンスを識別する方法を中心にシステムを設計する必要があります。ポインターを超えてオブジェクトが等しいかどうかをテストする必要がある場合は、それを行うだけです。

于 2012-10-21T09:28:18.777 に答える
1

NSObjectを提供しisEqual:、すべてのオブジェクトがの子孫である場合NSObject、簡単な答えは、デフォルトの実装が提供されるということです。

ここで、このデフォルトで使用されるアルゴリズムについて懸念があり、コメントに「テストするだけではわかりません」と記述します。楽しみのために、テストを見てみましょう;-)

isEqual:Appleがそのセマンティクスを変更することを決定した場合、結果は重大で良くない可能性があるため、これはかなり基本的な方法です。したがって、Appleはセマンティクスが同じであれば、実装方法を自由に変更できます。つまり、変更後も以前と同じオブジェクトが同等に比較されます。isEqual:ここで、3つの可能なアルゴリズムを使用できると述べました。

  1. ポインタの比較-まったく同じオブジェクトですか
  2. 浅い比較-オブジェクトのフィールドは直接比較された同じ値を持っていますか
  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少し。

于 2012-10-21T19:20:15.183 に答える