访问有效的非释放对象时出现EXC_BAD_ACCESS错误

时间:2011-08-11 11:54:23

标签: objective-c ios exc-bad-access autorelease nszombie

在发布对象时,我遇到了一个奇怪的问题。在对象的dealloc方法中,我将释放另一个(子)对象。释放此子对象时,出现EXC_BAD_ACCESS错误。我很确定在我调用release之前,子对象是一个有效的指针。

这就是我如何证实这种怪异 - 我在dealloc方法中设置了一个断点,就在子对象发布之前,它被分配了!我可以发送消息,它可以正确响应。另一个奇怪的错误是,如果NSZombieEnabled设置为YES,我根本不会收到错误,甚至NSZombie通常的错误都说我已经向已释放的对象发送了一条消息,代码运行正常。

有人知道如何解决这个问题吗?

提前致谢!


*编辑1 *

我发现如果我将[super dealloc]放在dealloc的末尾,它会崩溃,但是如果我把它放在开始,它就不会。我以前有过类似的东西,只有另一种方式 - 如果我在dealloc开始时我的[超级dealloc]崩溃了,而且最后没有。

为什么它会有所作为,什么时候应该使用什么?


*编辑2 *

Scratch Edit#1!它无论如何都不起作用。

2 个答案:

答案 0 :(得分:1)

你的dealloc例程是否恰好如下:

- (void)dealloc
{
   [super dealloc];
   [otherObject release];
}

如果是,请更改订单。如果你调用[super dealloc],你的对象就会从内存中消失,以后尝试访问otherObject会导致你访问未分配的内存 - > EXC_BAD_ACCESS。

答案 1 :(得分:0)

如果没有看到对象的初始化方式,任何人都很难确定。

MyObject *someObject = [MyObject alloc] init...]; // Make sure you aren't autoreleasing here
// do some stuff with someObject

[someObject release];