0

(作成した)2種類のオブジェクト(PiecesとOthers)を保持するNSMutableOrderedセットがあります。

PieceとOtherはどちらも、次のようにisEqualメソッドをオーバーライドします。

ピース:

- (BOOL)isEqual:(Piece *)object
{
    if (([title isEqualToString:[object title]])
        && ([composer isEqualToString:[object composer]])
        && (major == [object major])
        && (tempo == [object tempo])
        && (pieceKey == [object pieceKey])
        && (pieceTime == [object pieceTime]))
        return YES;
    else 
        return NO;
}

他の:

- (BOOL)isEqual:(Other *)object
{
    if (([title isEqualToString:[object title]])
        && ([subTitle isEqualToString:[object subTitle]])
        && ([description isEqualToString:[object description]])
        && (otherTime == [object otherTime]))
        return YES;
    else 
        return NO;
}  

また、両方のクラスのハッシュをオーバーライドして、インスタンスごとに一意のハッシュを作成します(ivarのint値を取得して追加することにより)。

私のアプリでは、An Otherがセットから削除され、セットにピースを追加しようとすると、次のようになります。

-[Other isEqual:]: message sent to deallocated instance 0x80d5680

ハッシュメソッドは次のとおりです。

- (NSUInteger)hash
{
    NSUInteger prime = 31;
    NSUInteger result = 1;
    result = prime * (result + [title intValue]);
    result = prime * (result + [composer intValue]);
    result = prime * (result + major);
    result = prime * (result + tempo);
    result = prime * (result + pieceKey);
    result = prime * (result + pieceTime);
    return result;
}

なぜこれが起こっているのか誰かが知っているなら、私は本当に助けになるでしょう。

ありがとう、

4

2 に答える 2

2

これは実際には答えではありませんが、問題を見つけるのに役立ちます。いくつかの質問:

  • 0x80d5680が以前に削除されたインスタンスであることを確認しますか?
  • セットからどのように削除しますか?
  • オブジェクトを追加した後、オブジェクトの状態を変更しますか?
  • ハッシュが一意であることを確認しますか(ivarsサウンドのint値の合計は疑わしいように聞こえます)。

最後に、オブジェクトが次のルールに従っていることを確認してください。

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

詳細については、 NSObjectプロトコルリファレンスを参照してください。

于 2012-04-26T15:38:51.977 に答える
0

セットはユニークなアイテムのグループであるため、isEqualはセット比較の一部としてメンバーに呼び出されると思います。おそらく、古いセットから削除する前に、新しいセットにメンバーを追加する必要がありますか?

お役に立てれば!

于 2012-04-26T15:26:18.613 に答える