0

現在、NSMutableDictionary を使用して非常に奇妙な問題があります。同じコード、同じデータですが、キーと値のペア オブジェクトの結果が異なります。

私の辞書は、キーと値がオブジェクトの配列であるため、ユーザー定義のクラス オブジェクトを使用します。

辞書を作成するコードは次のとおりです。

_designs = [[NSMutableDictionary alloc] init];
for (Hierarchy * hier in downloadedHierarchies.objects)
{
    NSLog(@"Hierarchy [%d - %d - %@]", hier.designId, hier.hierarchyId, hier.hierarchyName);
    Design * aDesign = [[Design alloc] initWithId:hier.designId withName:hier.designName];

    NSMutableArray *array = ([_designs objectForKey:aDesign] == nil) ? [[NSMutableArray alloc] init] : (NSMutableArray *)[_designs objectForKey:aDesign];
    NSLog(@"Design %d has %d of hierarchies", aDesign.designId, array.count);

    [array addObject:hier];

    [_designs setObject:array forKey:aDesign];
    NSLog(@"Design %d now has %d of hierarchies", aDesign.designId, [[_designs objectForKey:aDesign] count]);
}

問題は次のとおりです。 - テスト データには 1 つのデザインと 3 つの階層しかありません。アプリケーションを実行するたびに、辞書に異なる結果が表示されます。2 つのキーと値のペアを取得することもあれば、3 つのキーと値のペアを取得することもあります。キーでさえ同じデザイン (同じ designId) からのものであり、階層はそれらのキーと値のペアに散らばっています。

いくつかのメモ:

  • 設計はすでに NSCopying と isEqual を実装しており、問題なくテストされています

  • Hierarchy は NSCopying も実装しています

  • これらのコード行をデバッグすると、正しい結果が得られます

ここで何が間違っていますか?

4

1 に答える 1

0

Design オブジェクトで isEqual と hash も指定する必要があります。これは、NSObject のプロトコルの説明から取得されます。

isEqual: レシーバーと特定のオブジェクトが等しいかどうかを示すブール値を返します。(必要)

  • (BOOL)isEqual:(id)anObject パラメータ anObject レシーバーと比較するオブジェクト。戻り値 レシーバーと anObject が等しい場合は YES、そうでない場合は NO。

考察 このメソッドは、インスタンスが等しいとはどういう意味かを定義します。たとえば、コンテナ オブジェクトは、対応するすべてのオブジェクトが isEqual: 要求に対して YES と応答する場合、2 つのコンテナを等しいと定義する場合があります。このメソッドの使用例については、NSData、NSDictionary、NSArray、および NSString クラスの仕様を参照してください。

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

于 2012-07-19T13:06:38.943 に答える