0

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

    if (self.videoEngine != nil)
{
    [self.videoEngine.player.view removeFromSuperview];

    [videoEngine release];
    self.videoEngine = nil;
}

videoEngine 对象是 (nonatomic, retain),它是使用 videoEngine = _videoEngine 合成的。如果我删除 self.videoEngine = nil 行,则代码可以正常工作。这是正确的行为,为什么 nil 行会导致崩溃?self.videoEngine = nil 是否仍会导致 viewDidUnload 函数出现问题?

4

2 回答 2

5

当您调用“self.videoEngine = nil;”时 它调用它的 setter 方法,默认情况下在 setter 方法中释放对象,然后将其设置为您提供的值,因此在这种情况下,您释放对象一次,然后 setter 方法尝试再次释放它,即导致崩溃,现在如果您删除“[videoEngine release];” 那很好,不会有内存泄漏。

希望现在很清楚。

于 2012-07-23T11:32:41.670 回答
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];

于 2012-07-23T13:07:02.417 回答