addObject:
同様のケースをカバーするために使用されるNSMutableSet のメソッドのドキュメント:
セットに がすでに存在する場合anObject
、このメソッドはセットまたは のいずれにも影響しませんanObject
。
しかし、リンクをたどってみるとわかるように、現在のバージョンにはそのようなことさえありません。そして、そのステートメントでさえ、実際には同じオブジェクトを追加しようとしているだけです。異なるが等しいオブジェクトの追加には具体的に対処していません。
観察されているが文書化されていない動作に依存することは、OS のバージョン間で変化する可能性があるだけでなく、まったく同じプロセス内で変化する可能性があるため、危険です。これは、NSSet がクラス clusterであるためです。つまり、複数の実装が存在する可能性があります。どちらを取得するかは、セットの作成方法によって異なります。特定の実装が選択されること、または存在することを保証する方法はありません。*
それは問題にすべきではないからです。クラスター化されたサブクラスはすべて、クラスターのインターフェースとドキュメントで定義されているものと同じ動作を示します。(そうでない場合、それはバグであり、報告する必要があります。) すべてのサブクラスが事実上同じことを行うことを考えると、どのサブクラスのインスタンスを取得しても問題ありません。
オブジェクトにも同じ原則が適用されます。彼らは等しいです!そのため、どちらがセットに入っているかは問題ではありません。それが問題になる場合、それらは真に等しいとは言えず、オブジェクトの等価性の定義をより厳格にする必要があります。isEqual:
( と の両方を 更新することを忘れないでくださいhash
。)
セットを何に使用しているかによっては、それをさらに進めて、2 つの同等のオブジェクトが存在しないようにしたい場合があります。これを行うには、セットの所有権、保守、および使用をメンバー オブジェクトのクラスに移動し、可能かつ適切な場合に新しいオブジェクトを作成するのではなく、常に一致するオブジェクトを返すようにします。
*また、実装の 1 つを選択できたとしても、それがあなたが観察した動作を永久に保持するという保証はありません。別の OS バージョンでは異なる可能性があり、Murphy はおそらくそうすると言います.