为什么将self.object设置为nil会导致崩溃

时间:2012-07-23 11:26:57

标签: objective-c xcode null dealloc

在以下情况中,我遇到了崩溃

    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函数出现问题?

2 个答案:

答案 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];