尝试将NSArray中的条目添加到NSDictionary中,但NSDictionary中的值将被取消分配

时间:2012-12-05 21:36:19

标签: objective-c memory-management nsdictionary

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

1 个答案:

答案 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];