0

Card オブジェクトを含む NSArray オブジェクトのラッパーにすぎない 3 つの Deck オブジェクトがあります。最初は、すべてのカード オブジェクトがデッキ 1 にあり、最終的にデッキ 2 とデッキ 3 を移動します。

NSString オブジェクトを Card オブジェクトにマップする NSDictionary オブジェクトもあります。デッキ 1 のカードを使用して、ゲームの開始時にこのルックアップ テーブルを次のように構築します...

-(NSDictionary *)buildLookupTable {
    NSMutableDictionary *lookup = [[NSMutableDictionary alloc] init];

    for (Card *card in self.cards) {
        NSString *lookupCode = [self buildCode:card];
        [lookup setObject:card forKey:lookupCode];
    }

    return lookup;
}

次に、NSDictionary とデッキをレイヤー オブジェクトに渡しますが、NSString に基づいて特定のカードを検索しようとすると、「-[CFString ハッシュ]: 割り当て解除されたインスタンスに送信されたメッセージ」が表示されますが、カードを簡単に見つけることができますデッキ 1 またはデッキ 2 で、割り当て解除されていないものを探しています。

目的の値を取得するためのキーとして使用している NSString は割り当て解除されておらず、NSDictionary 自体も解放されていません。NSDictionary オブジェクトの allValues メソッドからの戻り値を繰り返し処理しましたが、いずれも解放されていません。

他に割り当て解除されたオブジェクトはありますか?

Edit-version2: 少し絞り込みました。

ルックアップコードでは、これは機能します

NSString *key = @"4-0"; //(NSString *)sprite.userData;
return [self.cardLookup objectForKey:key];

しかし、これはそうではありません

NSString *key = (NSString *)sprite.userData; // value is @"4-0"
return [self.cardLookup objectForKey:key];

デバッガでは、sprite.userData は正常に見えます。

sprite.userData は Card クラスの buildSprite メソッドで次のように定義されています...

sprite.userData = [NSString stringWithFormat:@"%i-%i",self.x, self.y];

キーで copyWithZone を呼び出しても機能しないようです (他の NSString の場合と同様)。

4

1 に答える 1

0

問題を発見!

問題は sprite.userData オブジェクトとその作成方法にありました。

sprite.userData = [NSString stringWithFormat:@"%i-%i",self.x, self.y];

どうやら sprite.userData が解放されていたようです (おそらくゾンビ オブジェクトを有効にしていたため、Xcode デバッガーはそれが何であるかを認識しているように見えました)。正しいバージョンは...

sprite.userData = [[NSString stringWithFormat:@"%i-%i",self.x, self.y] retain];
于 2012-12-06T00:56:51.867 に答える