2012-07-23 99 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

相關問題