2011-06-18 71 views
28

我知道在主方法中創建了一個autorelease池,並且接收autorelease消息的所有對象都存儲在此池中,並在池消耗完後釋放。爲什麼使用Autorelease池?

但總是說要避免自動釋放對象以避免內存泄漏,從而導致應用程序崩潰。

那麼爲什麼在什麼條件下我們應該使用autoreleasepool?

Apple文檔建議我們在使用線程時需要使用它們,因此在線程開始時我們需要創建一個自動釋放池,並在線程結束時將其耗盡,但如果我們不創建自動釋放對象在完整的線程中,那麼在這種情況下,也需要在線程的開頭創建一個autoreleasepool。

請清除我的困惑。 Thanx。

回答

19

你的假設是正確的。當你可以確保一個特定的線程永遠不會使用自動釋放對象時,該線程就不需要一個自動釋放池。

避免autoreleasepool是一個不好的建議,硬幣有兩面。使用autorelease'd對象會帶來一定的開銷(儘管在大多數情況下無關緊要),但應儘可能避免。特別是在方法存在多個退出或者可能遇到異常的情況下,自動釋放有助於避免內存泄漏並使代碼更清潔。

但請注意,這意味着該線程無法使用autorelease,包括您可能調用的任何框架。在某些情況下,例如在經典的生產者/消費者場景中。你有一個生產者創建對象,將它們分派給主線程runloop,並且可以在主線程autoreleasepool中註冊它們。

一般來說,我不會建議在沒有autoreleasepool的情況下創建一個執行重要工作的線程(除了一個簡單的,長時間運行的計算)。

+0

將創建一個沒有autorelease池的線程導致內存泄漏? –

+2

是的,如果你在該線程上自動釋放一個對象,並且沒有游泳池,你將有泄漏。 –

+0

那是有爭議的。 http://stackoverflow.com/questions/12575010/using-arc-is-it-fatal-not-to-have-an-autorelease-pool-for-every-thread –

相關問題