【问题标题】:NSMutableArray released twice by releaseNSMutableArray 按 release 发布两次
【发布时间】:2012-11-15 16:22:26
【问题描述】:

在didFinishLaunchingWithOptions中,第一个代码是:

NSMutableArray *k = [[NSMutableArray alloc] initWithCapacity:10];
[k release];

(经过多次调试,我将其简化为这种情况)并且我得到了

*** -[__NSArrayM class]: message sent to deallocated instance 0x7576c90
*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x7576c90

如果我在 alloc 行之后检查 'k' 上的 retainCount,它是 1。如果我用 NSArray 替换 NSMutableArray 一切都很好。这到底是怎么回事??

【问题讨论】:

  • 在这之后你用k做什么?
  • @chrislhardin 什么?绝对不是这样的。 NSMutableArray(通常)在后台使用链表实现,NSArray 使用实际数组。但是,不同的情况和构造函数可以改变它的支持方式。
  • 发生的事情超出了这两行。我将它们复制到一个旧的(ARC 之前的)测试项目中,没有出现任何错误。
  • 您对项目进行了清理吗? cmd-shift-k
  • @JorisWeimar:这很重要。在你释放它之后,你就不能再使用k指向的NSMutableArray对象——对象被释放并且k变成了一个悬空指针。您可以再次使用 变量 k,但在此之前,您必须指定 k 指向另一个对象或 nil

标签: ios nsmutablearray retain dealloc


【解决方案1】:

该错误一定来自其他地方。这意味着你正在使用它。 否则,你不会有

*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x7576c90

但是类似:

*** -[__NSArrayM release]: message sent to deallocated instance 0x7576c90

另外,你不应该使用 retainCount(看看为什么here)。

只需检查您没有在其他任何地方使用它。或者,也许你正在使用 ARC ?在这种情况下,您不需要释放它。

【讨论】:

  • 是的,我检查了 ARC。这就是我首先想到的。此外,当我使用调试器单步执行它时,它在发布行上给了我这个错误。我只是使用retainCount 来查看计数是多少。那时它应该是 1,而且确实是。
  • 如果他使用 ARC,release 将被禁止。所以这不可能。
【解决方案2】:

如果您启用了僵尸,但仍然在控制台中看到如下错误:

2013-08-26 16:08:22.540 test[1231:303] * -[__NSDictionaryM respondsToSelector:]:消息发送到已释放实例 0x101b039a0

并且您已将代码精简为几行,并且您确定您没有过度释放对象,问题很可能是由于调试器在您单步执行时向已正确释放的对象发送消息引起的它。当您不单步执行代码时,不会发出控制台消息。要看到它发生,请启用僵尸并单步执行以下代码。发布后,上述消息将发送到控制台。

-(void)testDictionary
{
  NSMutableDictionary *outboundDictionary = [[NSMutableDictionary alloc] init];
  [outboundDictionary release];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多