【问题标题】:Trying to add entries in NSArray to NSDictionary, but values in NSDictionary are getting deallocated试图将 NSArray 中的条目添加到 NSDictionary,但 NSDictionary 中的值正在被释放
【发布时间】: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


【解决方案1】:

找到问题了!

问题在于 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];

【讨论】:

  • 所以你没有使用 ARC。而且 sprite.userData 不保留。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多