1

我的应用程序崩溃了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
}

出了什么问题?

4

2 回答 2

11

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

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

清理 self 上的资源 -> 清理 super 上的资源 -> 清理 super 的 super 上的资源 -> etc -> 运行时回收的内存。

很好,如果你按照自己的方式做会发生什么?

清理 super 上的资源 -> 清理 super 的 super 上的资源 -> etc. -> 运行时回收的内存 -> 清理 self 上的资源

糟糕,现在您正在访问回收的内存并尝试与它进行交互(即 EXC_BAD_ACCESS 或更糟,在另一个对象的其他地方弄乱内存而没有意识到它)。

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

于 2012-07-11T03:20:30.490 回答
0

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

于 2012-07-11T03:22:28.747 回答