我的应用程序在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
}
怎么了?
最佳答案
将[super dealloc]
放在最后而不是放在第一。
编辑:发生这种情况的原因是由于objc对象的生命周期。当它死亡时,将向该对象发送dealloc
消息。在该方法内部,对象必须清理自身,并在继承链中传递消息(因为 super class 也需要清理自身)。好吧,如果最后[super dealloc]
正确地执行此操作会发生什么?
在self上清理资源->在super上清理资源->在super的super上清理资源->等等->运行时回收的内存。
很好,如果按照自己的方式做会怎样?
在super上清理资源->在super的super上清理资源->等等->运行时回收的内存->在self上清理资源
糟糕,现在您正在访问回收的内存并尝试与之交互(即EXC_BAD_ACCESS或更糟糕的是,在另一个对象上的其他地方弄乱了内存并且无法实现)。NSObject
的dealloc方法从字面上释放内存(可能通过free()
),因此一旦调用,您就处于未定义的危险灰色区域。
关于iphone - 应用程序在dealloc中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11425030/