NSArray版本因EXC_BAD_ACCESS而崩溃

时间:2010-08-29 17:40:46

标签: iphone objective-c xcode

另一个益智游戏。我有一个NSArray(iTours),包含3个对象,保留计数为1.

此数组在对象dealloc方法中发布如下:

- (void)dealloc {
    NSLog(@"retain count für iTouren: %d", [iTours retainCount]);
    [iTours release];  // triggers EXC_BAD_ACCESS 
    [super  dealloc];
}

控制台窗口显示以下消息(无更多详细信息):

  

收到信号:   “EXC_BAD_ACCESS”。

任何线索是怎么回事?我错过了什么?

6 个答案:

答案 0 :(得分:18)

最有可能的是,你过度释放iTouren,因此,对release的调用导致了崩溃。也就是说,当您释放包含数组时,iTouren已被解除分配,并且当包含该数组的数组将release发送到已解除分配的iTouren您的应用程序崩溃时。

(当然,iTours可能是已经解除分配的对象。无论如何,这是一个过度释放的问题。)

启用僵尸检测并查看是否可以解决特定问题。

请注意retainCount返回的

号码无用

。绝对保留计数是一个实现细节,通常是一个看起来像废话的特定值。

在这种情况下,对象的最终release不会减少保留计数。为什么?因为无论如何,当对象即将被解除分配时,这将是一个浪费的循环。 retainCount不可能返回0,因为根据定义,保留计数为0的对象已经被释放,因此,不再是一个可行的消息接收者。

答案 1 :(得分:4)

永远不会依赖retainCount方法。

自从。

我有没有提过?

答案 2 :(得分:0)

一个是iTours另一个iTouren。您正在记录与发布不同的对象。

答案 3 :(得分:0)

假设iToursiTouren是不同的对象(即iTours是包含NSArray的{​​{1}}),那么您已经过度释放iTouren;也许你在setter中失败了,iTours被释放而没有被重新分配和保留。

答案 4 :(得分:0)

确保您的阵列不包含自身。释放数组也会释放其中的每个对象。当然,如果是这种情况,那么在释放数组之前,数组的释放次数应该为2,因为数组会保留它们的元素。

答案 5 :(得分:0)

已释放和释放的对象的保留计数为1.即将释放和释放的未释放对象的保留计数也为1.(假设为对象分配了内存,一些字符串和数字永远不会分配,每个Mac OS X版本更改的实现细节)

当在当前版本的Mac OS X中取消分配对象时,内存被标记为空闲,对象的任何内容都不会被修改(除非你告诉它)。因此,保留计数与释放前的保留计数保持一致。

这是一个错误和DIAF方法,有助于使Mac OS X如此稳固。