我有三个Deck对象,它们大多只是包含Card对象的NSArray对象周围的包装器。最初,所有Card对象都在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查找给定的卡时,我得到“ - [CFString hash]:将消息发送到解除分配的实例”,但我可以很容易地找到我正在寻找的卡片,而不是在deck1或deck2中取消分配。
我用作检索所需值的密钥的NSString没有被释放,NSDictionary本身也没有。我甚至迭代了NSDictionary对象的allValues方法的返回,也没有解除分配。
还有哪些其他解除分配的对象?
编辑 - 版本2: 我把它缩小了一点。
在查找代码中可以使用
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一样)。
答案 0 :(得分: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];