2012-07-23 62 views
0

在以下情况下我得到一个崩溃为什么设置self.object为零导致崩溃

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

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

的videoEngine对象(非原子,保留),并且它使用videoEngine = _videoEngine合成。如果我删除self.videoEngine = nil行,代码将正常工作。这是正确的行为,为什么零线会导致崩溃? self.videoEngine = nil仍然会在viewDidUnload函数中引发问题吗?

回答

0

您应该只发布_videoEngine,因为这是合成的名称。 videEngine只是setter和getter的名称,但是该值存储在合成名称中。所以,你的代码应该是:

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

    [_videoEngine release]; 
    self.videoEngine = nil; // Unnecessary 

}

但你鸵鸟政策需要调用self.videEngine =零释放_videEngine后,因为setter方法总是返回零。

它不被认为是通过调用setter方法来释放的正确方法,尽管它起作用,就像使用下面的行:self.videoEngine = nil; // Unnecessary。 正确的发布方式只有[_videoEngine release];

+0

真的吗?所以现在我很困惑,我应该释放并且不使用nil方法?还是他们有效地做同样的事情? – 2012-07-23 13:22:17

+0

你应该释放合成变量[_videoEngine release];之后你就不需要做其他事情了。你不应该使用self.videoEngine = nil;因为你发送一个零到setter,它可能需要一些处理时间。 – 2012-07-23 13:27:44

+0

好的,谢谢。将尝试而不是释放。 – 2012-07-23 13:28:42

5

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

希望现在很清楚。

+0

非常感谢,所以使用self.videoEngine = nil比释放更好?还是我需要在dealloc中释放_videoEngine呢? – 2012-07-23 12:43:54

+1

在释放对象之后,最好将对象设置为零,如果使用self.object = nil,它会自动释放并将其设置为零。 – Nilesh 2012-07-23 14:48:38

+0

在释放它之前检查对象是一种很好的做法,例如: if(self.object){self.object = nil; } – Nilesh 2012-07-23 14:54:49

相关问题