を維持ません、私は「サイト」と呼ばれるカスタムクラスを持っています。これは動作し、サイトのセットはすべてallSitesセットに追加されます。しかし重複したサイトは削除されません。 NSMutableSetが一意性を保証するために使用することを理解しているSiteのisEqualまたはhashcode実装で、これが私の間違いであると思われます。NSMutableSetは元素ユニーク
洞察力があれば幸いです。
を維持ません、私は「サイト」と呼ばれるカスタムクラスを持っています。これは動作し、サイトのセットはすべてallSitesセットに追加されます。しかし重複したサイトは削除されません。 NSMutableSetが一意性を保証するために使用することを理解しているSiteのisEqualまたはhashcode実装で、これが私の間違いであると思われます。NSMutableSetは元素ユニーク
洞察力があれば幸いです。
変更isEqual
方法:
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if ([[self name] isEqualToString:[other name]])
return YES;
return [super isEqual:other];
}
あなたSite
クラスのスーパークラスとは何ですか?スーパークラスのisEqual:
メソッドへの呼び出しは、特にあなたのクラスがNSObject
の直系子孫である場合、少し疑わしいと思われます。その場合、[super isEquals: other]
は基本的にself == other
にまで下がります。これは明らかにあなたが望むものではありません。これは、例えば、coding guidelines for cocoaで、議論されています
デフォルトのisEqualで:各オブジェクトのアドレスのポインタ平等を探し、ハッシュは、各オブジェクトのアドレスに基づいてハッシュ値を返すので、この不変が成り立ちます。
これは、しかし...
スーパークラスはNSObjectのある、ただの推測です。私はNSObjectののisEqual実装とあまり馴染みのなかった
:私はから、Appleの推奨のisEqual実装を以下ました。
@ phix23。うん、これは動作します。 @ダーク、説明のおかげで。おかげさまで皆さん、私はデバッガで私をたくさん時間を節約しました。
が呼び出されているかどうかを確認するためにisEqualにブレークポイントを設定します。スーパークラスが(NSObjectではなく)独自のクラスの1つであれば、そうする必要があります。私の編集された答えを見てください。 – Dirk
実際に – Felix