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 の場合と同様)。