【问题标题】:EXC_BAD_ACCESS for NSMutableArrayNSMutableArray 的 EXC_BAD_ACCESS
【发布时间】:2011-02-04 15:52:26
【问题描述】:

我有一个带有一些视图元素的 NSMutableArray。

我从视图层次结构中删除视图,然后检查数组的保留计数,它返回 1。然后我发送 [array release] 但代码转储为 EXC_BAD_ACCESS。

我看到数组中有元素,但代码仍然转储。

这是我在调试过程中发现的。该数组包含所有 100 个对象(数组计数返回 100),并且在调试器上看到的内容返回元素的“超出范围”。此外,由于数组位于视图层次结构中,以下代码将保留计数减少了 2:

for (Liv *view1 in viewArray){
    NSLog(@"view count = %d", [view1 retainCount]);
    [view1 removeFromSuperview];

    NSLog(@"view count = %d", [view1 retainCount]); 
}

【问题讨论】:

  • 甚至 [array removeAllObjects] 转储

标签: objective-c memory uiview nsmutablearray memory-leaks


【解决方案1】:

不要使用retainCount

这种调试没用;您正在使用框架视图层次结构中的视图。保留计数上升或下降 2、10 或 42 的原因可能有多种。

从目前发布的迂回证据来看,这似乎是一个非常简单的内存管理问题。

首先,使用“构建和分析”让 llvm 静态分析器检查您的代码。修复它发现的任何问题。

接下来,数组是如何分配的?你把它存放在哪里?发布声明或操作数组的所有代码行。

最后,正如保罗所说,打开僵尸,看看会发生什么。

这很可能不是保留/释放问题,但目前还没有任何证据表明这一点。

【讨论】:

    【解决方案2】:

    你是retain 还是alloc 数组?如果没有,您不应该发送release

    EXC_BAD_ACCESS 表示您正在向已释放的对象发送消息。您(或某处的某些代码)在您发送release(或removeAllObjects)的代码部分之前发布它。

    基本上,如果您的保留和释放是平衡的,您将不会收到此错误。我们需要先查看一些代码,然后才能提供通用建议以外的任何内容。

    使用NSLog()retainCount 并不是调试此类错误的最简单方法。假设您使用的是 Xcode 3.2.6,然后尝试通过 Run > Run with Performance Tool > Zombies 运行您的代码。这应该会给你一个很好的指示,告诉你代码的哪一部分有问题。

    【讨论】:

    • 好的,这是我在调试过程中发现的。该数组包含所有 100 个对象(数组计数返回 100),并且在调试器上看到的内容返回“超出范围”元素.. 另外,由于数组位于视图层次结构中,以下代码将保留计数减少了两倍: for (Liv *view1 in viewArray){ NSLog(@"view count = %d", [view1 retainCount]); [view1 removeFromSuperview]; NSLog(@"view count = %d", [view1 retainCount]); }
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多