2011-02-04 55 views
0

我有一个带有几个视图元素的NSMutableArray。EXC_BAD_ACCESS for NSMutableArray

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

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

这是我在调试过程中发现的。数组中有100个对象(数组返回100),而在调试器上看到的内容返回元素的“超出范围”。此外,由于该阵列是在视图层次,下面的代码减少了两个保留计数:

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

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

甚至[数组removeAllObjects]转储 – DKV 2011-02-04 15:53:15

回答

0

你有没有retainalloc的阵列?如果没有,你不应该发送它release

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

基本上,如果你的保留和释放是平衡的,你不会得到这个错误。我们需要看到一些代码,然后才能提供比通用建议更多的东西。

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

+0

是的我分配初始化数组 – DKV 2011-02-04 15:56:16

3

不要使用retainCount

这种调试没用,您正在框架的视图层次结构中处理视图。可能有多种原因导致保留计数增加2倍,10倍或42倍。

从迄今为止公布的证据来看,这似乎是一个非常直接的内存管理问题。

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

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

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

这不是一个保留/发布问题,但目前还没有任何证据可以表明。