【发布时间】:2012-12-05 21:36:18
【问题描述】:
我有三个 Deck 对象,它们大多只是包含 Card 对象的 NSArray 对象的包装器。最初,所有的卡片对象都在甲板 1 中,最终穿过甲板 2 和甲板 3。
我还有一个 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”,但我可以轻松在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 一样)。
【问题讨论】:
-
它已经这样做了,你的代码中有错误(不是发布的代码)。还要说明您是否使用 ARC。
-
您应该发布代码中可能导致该错误的其他部分
-
我使用的编译器是Apple LLVM compiler 4.1,所以我认为我使用的是ARC。
-
@user467384 你如何执行查找?
buildCode方法有什么作用? -
你有没有遍历 allKeys 并检查它们?
标签: objective-c memory-management nsdictionary