我的应用在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
}
出了什么问题?
答案 0 :(得分:9)
将[super dealloc]
放在最后而不是第一位。
编辑:发生这种情况的原因是由于objc对象的生命周期。当它死亡时,会向对象发送dealloc
消息。在该方法中,对象必须自我清理,并将消息传递给继承链(因为超类也需要自我清理)。那么,如果你在[super dealloc]
是最后一次的情况下正确地做到这一点会发生什么呢?
清理自己的资源 - >清理超级资源 - >清理超级超级资源 - >等 - >运行时回收的内存。
很好,如果按照自己的方式行事,会发生什么?
清理超级资源 - >清理超级超级资源 - >等等 - >运行时回收的内存 - >清理自己的资源
哎呀,现在你正在访问回收的内存并试图与它进行交互(即EXC_BAD_ACCESS或更糟糕的是,在另一个对象的其他地方弄乱内存并且没有意识到它)。
NSObject
的dealloc方法实际上释放了内存(可能是通过free()
),所以一旦你调用它就处于未定义的危险灰色区域。
答案 1 :(得分:0)
您使用的是什么版本的Xcode?新版本不需要您分配或释放内存。它为你来运行它。尝试注释掉dealloc方法,然后编译。