我有三个 Deck 对象,它们大多只是包含 Card 对象的 NSArray 对象的包装器。最初,所有卡片对象都在deck1 中,并最终通过deck2 和deck3。
我还有一个 NSDictionary 对象,它将 NSString 对象映射到 Card 对象。我在游戏开始时使用deck1中的卡片来构建这个查找表,就像这样......
-(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 和 Decks 传递给图层对象,但是当我尝试基于 NSString 查找给定的 Card 时,我得到“-[CFString hash]: message sent to deallocated instance”,但我可以轻松找到 Card我在deck1 或deck2 中寻找,而不是释放。
我用作检索所需值的键的 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];
看起来在 key 上调用 copyWithZone 不起作用(就像对任何其他 NSString 一样)。