5

Apple のドキュメントは現在、NSSet の「アイデンティティ」の概念を文書化していません。

Apple のコードに起因すると思われるバグがいくつかあります。たとえば、「[NSMutableSet MinusSet]」は文書化されているように機能しませんが、「アイデンティティ」が原因であると確信しています。

例: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html#//apple_ref/occ/cl/NSSet

含むオブジェクト:

特定のオブジェクトがセット内に存在するかどうかを示すブール値を返します。

anObject がセットに存在する場合は YES、そうでない場合は NO。

どういう意味ですか?

参考までに私が試したこと:

  1. セット内のすべてのクラスに「isEqual:」を実装
  2. すべてのクラスが同じクラスであることを確認しました (サブクラス/スーパークラスの混乱はありません)
  3. セット内のすべてのクラスに NSCopying を実装 (影響なし)
4

2 に答える 2

9

Cocoa では、オブジェクトの等価性は と を使用して行われますisEqual: hash:

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

のメモからisEqual::

2 つのオブジェクトが等しい場合、それらは同じハッシュ値を持つ必要があります。サブクラスで isEqual: を定義し、そのサブクラスのインスタンスをコレクションに入れる場合、この最後の点は特に重要です。サブクラスでもハッシュを定義していることを確認してください。

サブクラスは、同じものを返すように、これらの両方を実装する必要があります。これを行うと、Cocoa コレクションで正しく使用できます。

同等性が機能しない理由NSSetは、セットがハッシュを使用するためです (ハッシュ テーブルとして格納されます)。したがって、 のみを実装した場合isEqual:、ハッシュが異なる可能性 (かなりの可能性) があります。

于 2012-11-07T13:55:44.493 に答える
6

NSSetは古典的な意味でのハッシュ セットであるため、hashメソッドを実装して、オブジェクトが等しいと認識されるようにする必要があります。デフォルトでhashは、すべてのオブジェクトに固有の符号なし整数にキャストされたオブジェクトのポインタを返すだけなので、 true を返すオブジェクトでさえ、そのようにisEqual:認識されません。の動作に興味がある場合は、 のソース コードNSSet参照してください。CFSetNSSet

于 2012-11-07T13:53:05.363 に答える