此数组在对象dealloc方法中发布如下:
- (void)dealloc {
NSLog(@"retain count für iTouren: %d", [iTours retainCount]);
[iTours release]; // triggers EXC_BAD_ACCESS
[super dealloc];
}
控制台窗口显示以下消息(无更多详细信息):
收到信号: “EXC_BAD_ACCESS”。
任何线索是怎么回事?我错过了什么?
答案 0 :(得分:18)
最有可能的是,你过度释放iTouren
,因此,对release
的调用导致了崩溃。也就是说,当您释放包含数组时,iTouren
已被解除分配,并且当包含该数组的数组将release
发送到已解除分配的iTouren
您的应用程序崩溃时。
(当然,iTours
可能是已经解除分配的对象。无论如何,这是一个过度释放的问题。)
启用僵尸检测并查看是否可以解决特定问题。
请注意retainCount
返回的
在这种情况下,对象的最终release
不会减少保留计数。为什么?因为无论如何,当对象即将被解除分配时,这将是一个浪费的循环。 retainCount
不可能返回0,因为根据定义,保留计数为0的对象已经被释放,因此,不再是一个可行的消息接收者。
答案 1 :(得分:4)
永远不会依赖retainCount方法。
自从。
我有没有提过?
答案 2 :(得分:0)
一个是iTours
另一个iTouren
。您正在记录与发布不同的对象。
答案 3 :(得分:0)
假设iTours
和iTouren
是不同的对象(即iTours是包含NSArray
的{{1}}),那么您已经过度释放iTouren
;也许你在setter中失败了,iTours
被释放而没有被重新分配和保留。
答案 4 :(得分:0)
确保您的阵列不包含自身。释放数组也会释放其中的每个对象。当然,如果是这种情况,那么在释放数组之前,数组的释放次数应该为2,因为数组会保留它们的元素。
答案 5 :(得分:0)
已释放和释放的对象的保留计数为1.即将释放和释放的未释放对象的保留计数也为1.(假设为对象分配了内存,一些字符串和数字永远不会分配,每个Mac OS X版本更改的实现细节)
当在当前版本的Mac OS X中取消分配对象时,内存被标记为空闲,对象的任何内容都不会被修改(除非你告诉它)。因此,保留计数与释放前的保留计数保持一致。
这是一个错误和DIAF方法,有助于使Mac OS X如此稳固。