2012-07-11 41 views
0

我的应用程序崩溃在dealloc,但只是有时。应用程序在dealloc崩溃

我创建了一个用于缓存5个对象的数组。当用户点击右侧或左侧时,会添加一个新对象并删除最后一个对象。当我测试应用程序时,点击右侧或左侧按钮100-500次,应用程序崩溃。

该应用程序在dealloc方法崩溃,但所有对象分配和正确释放。

dealloc方法:

- (void)dealloc 
{ 
    [super dealloc]; 
    [_sImageLane release]; 
    [_sTipoLane release]; 
    [_maRecomended release]; 
    [_maProdcucts release]; // here crash in this line EXC_BAD_ACCESSE 
} 

到底哪里出问题了?

回答

8

[super dealloc]最后而不是第一。

编辑:发生这种情况的原因是由于objc对象的生命周期。当它是死的时候,对象被发送dealloc消息。在该方法内部,对象必须自行清理,并将消息传递给继承链(因为超类也需要自行清理)。那么,如果你在[super dealloc]最后一次正确地做到这一点,会发生什么?

清理自我资源 - >清理超级资源 - >清理super超级资源 - > etc - >运行时回收内存。

不错,好吧,如果你这样做,会发生什么?在超级

清理资源 - >清理上超级的超级资源 - >等 - >内存运行时回收 - >清理自我

哎呀资源,现在您正在访问回收的存储器并试图与它交互(即EXC_BAD_ACCESS或更糟糕的是,在另一个对象的其他地方弄乱了内存,而没有意识到它)。

NSObject的dealloc方法从字面上释放内存(可能通过free()),所以一旦你调用了你处于未定义的危险灰色区域。

+0

谢谢@borrden我要证明这一点,我会注意到你。 – NTTake 2012-07-11 03:27:45

+0

上帝的母亲这是解决我的问题,谢谢@borrden,但为什么?为什么叫超级最后?谢谢 – NTTake 2012-07-11 03:42:59

+0

@NTTake我会用解释编辑我的答案。 – borrrden 2012-07-11 03:45:08

0

你使用的是什么版本的Xcode?新版本不要求您分配或释放内存。它为你来运行。尝试注释掉dealloc方法,然后编译。

+0

如果OP没有使用ARC,那么注释'[super dealloc]'可能会修复崩溃,但会导致内存泄漏。我怀疑@borrrden有正确的答案。 – mttrb 2012-07-11 03:25:03

+0

不完全正确。您必须明确启用ARC。在新版本的XCode上创建的新项目默认已启用,但较早的项目必须启用它。 – sosborn 2012-07-11 03:26:15

+0

不,我不使用弧这不是一个选项谢谢。 – NTTake 2012-07-11 03:28:32