0

我有一個簡單的問題。當保留數很高時,autorelease是否工作?autorelease的使用和保留

例如...如果我在一個視圖控制器,並執行以下操作:

[self retain]; 
[self retain]; 
[self retain]; 
[self retain]; 
[self autorelease]; 

如果我流行的觀點,將它釋放?

謝謝。

+1

Autorelease只是一個'延期發佈';它會在稍後的某個時間,未指定的時間被釋放。所以它只會平衡一個保留。 – 2012-07-13 20:39:31

+0

在任何情況下,autorelease是**不是**一種神奇的方法,無論如何都會刪除你的對象;保留計數必須平衡。或者更好:對象所有權薄霧進行明確和管理。 – 2012-07-14 14:37:27

回答

0

Autorelease只是將對象添加到自動釋放池。釋放自動釋放池時,將釋放消息發送到該對象以及該池中的所有其他對象。如果您的保留計數仍然大於零,並且您沒有進一步發佈,那麼您將有內存泄漏。

我相信如果你像上面說的那樣做,你將有一個保留數爲5(一個來自alloc,而4個來自上面的四個保留)。您將該對象添加到autorelease隊列中,以便稍後它將收到一個版本並將保留計數減1。最後彈出視圖應該再減少一個。這將留下3的保留數。所以我會認爲你會有內存泄漏。

但是,如果您使用的是iOS 5,則最新的編譯器使用ARC(自動引用計數),您無需擔心此問題。很好,大部分。

EDITED:更正對象從autorelease池發送釋放時。參見: Advanced Memory Management對不起,錯誤的信息。

+0

這不是「經過一段時間」。當某人在自動釋放池上調用「drain」或「release」時,通常是創建它的相同函數,在調用堆棧的某處。 – newacct 2012-07-14 00:22:56

+0

文檔說'(或者至少是說)至少是'一段時間後'的一些內容。對於默認池,我相信它是在運行循環的每個「循環」的末尾。無論如何,添加的對象應該至少在當前的方法/函數返回之前。 – 2012-07-14 14:34:06

+0

所以基本上它是一個'延遲發佈',除非你有一個自定義池在那裏馬上排水,我想。 – 2012-07-14 14:35:30