2012-04-26 5 views
0

私は作成した2種類のオブジェクト(Piecesなど)を保持するNSMutableOrderedセットを持っています。私もユニークを作成するために、両方のクラスのハッシュを上書きIsEqualメソッドは、オブジェクトをMutableOrderedSetに追加しようとすると、割り当て解除されたインスタンスに送信されます。

- (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; 
} 

ワンピースやその他の両方彼らの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; 
} 

その他各インスタンスのハッシュ(ivarsのint値を取得して追加することによって)。私のアプリで

は、アンその他がセットから削除され、その後、私はセットに曲を追加しようとすると、私はこの取得:

- (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; 
} 
:ここ

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

をハッシュ方式であります

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

おかげで、

+0

あなたは[オブジェクトの説明]を呼びそそうとしていますか? NSObject関数です。 –

+0

それは問題である可能性があります、私はdescriptionと呼ばれるインスタンス変数を持っています、私は完全にNSObjectの記述方法について忘れました –

+0

私はちょうどそれをチェックし、インスタンスを[pieceSession removeObjectAtIndex:section - 2] isEqualメソッドを取得している同じインスタンスです。 –

答えて

2

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

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

最後に、あなたのオブジェクトは、このルールに従うことを確認してください。

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

詳細については、NSObject Protocol Referenceを参照してください。

+0

ありがとうKristian、ここにいくつかの答えがあります。私は0x80d5680が以前に削除されたインスタンスだと確信しています。私はremoveObjectAtIndexメソッドでそれを削除します。オブジェクトを追加した後にオブジェクトの状態を変更することはできますが、この特定の場合は実行しません。オリジナルの投稿を変更して、ハッシュメソッドを含むようにしました。 –

+0

isEqualメソッドは、id型の単一のパラメータを取るNSObjectのisEqualをオーバーライドしません。あなたの実装は実際にそのメソッドをオーバーロードします。それが意図的であるかどうかは分かりませんが、その結果、Pieceのインスタンスは他のインスタンスと決して等しくはありません。また、あなたのハッシュ方法については、文字列が数値で始まらない場合(先頭の空白を無視して)、intValueは0を返しますか? –

+1

NSMutableOrderedSetはNSMutableSetを内部的に使用して、複製を決定し、NSMutableArrayを使って順序を保持すると仮定します。そのようなデータ構造にオブジェクトを追加し、その状態をハッシュ値が変更されるように変更すると、削除時に次のようなことが起こります。内部配列のオブジェクトをインデックスで検索しますが、ハッシュが変更されたため、セット内で見つけてください。オブジェクトは順序集合によって保持され、配列内で見つかったため解放されますが、集合内に残り、次のオブジェクトが挿入されたときに例外が発生します。 –

0

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

希望すると便利です。

+1

Pieceが追加されたときに、削除されたOtherのインスタンスでisEqualが呼び出されるのはなぜですか?また、NSSetは順序付けされていませんが、追加されたオブジェクトが重複しているかどうかを判断するためにisEqualが使用されます。 –

+0

申し訳ありませんが、投稿を誤読し、KyleがNSMutableSetを使用していると思いました。 –

関連する問題