我有一个带有一些视图元素的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 :(得分:3)
这种调试没用;您正在使用框架的视图层次结构中的视图。保留计数上升或下降2,10或42可能有多种原因。
从目前发布的迂回证据来看,这似乎是一个非常简单的内存管理问题。
首先,使用“构建和分析”让llvm静态分析器检查您的代码。修复它识别的任何问题。
接下来,如何分配数组?你在哪里存放?发布声明或操纵数组的所有代码行。
最后,正如保罗所说,打开僵尸,看看会发生什么。
这可能不是保留/释放问题,但是没有任何证据表明这一点。
答案 1 :(得分:0)
您是retain
还是alloc
阵列?如果没有,您不应该发送release
。
EXC_BAD_ACCESS表示您正在向已经发布的对象发送消息。您(或某些代码)在您发送release
(或removeAllObjects
)的代码部分之前发布它。
基本上,如果您的保留和释放是平衡的,您将不会收到此错误。在我们提供除通用建议之外的任何内容之前,我们需要查看一些代码。
使用NSLog()
和retainCount
并不是调试此类错误的最简单方法。假设您使用的是Xcode 3.2.6,请尝试通过Run>运行代码。使用Performance Tool运行>植物大战僵尸。这应该会给你一个很好的指针,指出代码的哪一部分有问题。