0

我有三个 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 一样)。

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 回答