2011-02-07 5 views
0

を維持ません、私は「サイト」と呼ばれるカスタムクラスを持っています。これは動作し、サイトのセットはすべてallSitesセットに追加されます。しかし重複したサイトは削除されません。 NSMutableSetが一意性を保証するために使用することを理解しているSiteのisEqualまたはhashcode実装で、これが私の間違いであると思われます。NSMutableSetは元素ユニーク

洞察力があれば幸いです。

+0

実際に – Felix

答えて

1

変更isEqual方法:

- (BOOL)isEqual:(id)other { 
    if (other == self) 
     return YES; 
    if ([[self name] isEqualToString:[other name]]) 
     return YES; 
    return [super isEqual:other]; 
} 
0

あなたSiteクラスのスーパークラスとは何ですか?スーパークラスのisEqual:メソッドへの呼び出しは、特にあなたのクラスがNSObjectの直系子孫である場合、少し疑わしいと思われます。その場合、[super isEquals: other]は基本的にself == otherにまで下がります。これは明らかにあなたが望むものではありません。これは、例えば、coding guidelines for cocoaで、議論されています

デフォルトのisEqualで:各オブジェクトのアドレスのポインタ平等を探し、ハッシュは、各オブジェクトのアドレスに基づいてハッシュ値を返すので、この不変が成り立ちます。

これは、しかし...

0

スーパークラスはNSObjectのある、ただの推測です。私はNSObjectののisEqual実装とあまり馴染みのなかった

http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/ObjectComparison.html

:私はから、Appleの推奨のisEqual実装を以下ました。

@ phix23。うん、これは動作します。 @ダーク、説明のおかげで。おかげさまで皆さん、私はデバッガで私をたくさん時間を節約しました。

+0

が呼び出されているかどうかを確認するためにisEqualにブレークポイントを設定します。スーパークラスが(NSObjectではなく)独自のクラスの1つであれば、そうする必要があります。私の編集された答えを見てください。 – Dirk

関連する問題