在以下情况中,我遇到了崩溃
if (self.videoEngine != nil)
{
[self.videoEngine.player.view removeFromSuperview];
[videoEngine release];
self.videoEngine = nil;
}
videoEngine对象是(非原子的,保留的),它是使用videoEngine = _videoEngine合成的。如果我删除self.videoEngine = nil行代码正常工作。这是正确的行为,为什么nil线会导致崩溃? self.videoEngine = nil是否仍会导致viewDidUnload函数出现问题?
答案 0 :(得分:5)
当你打电话给“self.videoEngine = nil;”时它调用它的setter方法并在setter方法中默认释放对象然后将它设置为你提供的值,所以在这种情况下你释放你的对象一次然后setter方法试图再次释放它导致崩溃,现在如果您删除“[videoEngine release];”那没关系,没有内存泄漏。
希望现在很清楚。
答案 1 :(得分:0)
您应该只释放_videoEngine,因为这是合成名称。 videEngine只是setter和getter的名称,但该值存储在合成名称中。所以你的代码应该是:
if (self.videoEngine != nil)
{
[self.videoEngine.player.view removeFromSuperview];
[_videoEngine release];
self.videoEngine = nil; // Unnecessary
}
但是在释放_videEngine之后你不需要调用self.videEngine = nil因为setter总是会返回nil。
通过使用nil调用setter方法,它不被认为是一种正确的释放方法,尽管它有效,就像使用行self.videoEngine = nil; // Unnecessary
一样。
正确的释放方式只有[_videoEngine release];