自動釋放池autoreleasepool

2021-09-09 03:51:18 字數 1056 閱讀 1956

自動釋放池是nsautoreleasepool的例項,其中包含了收到autorelease訊息的物件。當乙個自動釋放池自身被銷毀(dealloc)時,它會給池中每乙個物件傳送乙個release訊息(如果你給乙個物件多次傳送autorelease訊息,那麼當自動釋放池銷毀時,這個物件也會收到同樣數目的release訊息)。可以看出,乙個自動釋放的物件,它至少能夠存活到自動釋放池銷毀的時候。

簡單的說乙個例子,返回區域性堆上變數的指標(用c++的口吻說的),那麼這個物件如何釋放?objective-c發明了自動釋放機制。

-(obj*) foo

obj* temp = [[obj alloc]init];

return [ obj autorelease];//只是在返回的時候加上關鍵字autorelease

《objective-c基礎教程》上說:自動釋放(autorelease)是一種延遲釋放機制,這樣保證區域性堆上的變數能夠被外部正常使用。

但是,系統又是什麼時候釋放的呢?在每乙個事件週期(event cycle)的開始,系統會自動建立乙個自動釋放池;

在每乙個事件週期的結尾,系統會自動銷毀這個自動釋放池。一般情況下,你可以理解為:當你的**在持續執行時,自動釋放池是不會被銷毀的,這段時間內你也可以安全地使用自動釋放的物件;當你的**執行告一段落,開始等待使用者輸入(或者其它事件)時,自動釋放池就會被釋放掉,池中的物件都會收到乙個release訊息,有的可能會因此被銷毀。

這是很難確定的時間,如果自動釋放池的銷毀時間過早,那麼程式就很危險,這個恐怕很難滿足程式設計師的要求吧。

自動釋放池的缺點:它延緩了物件的釋放,在有大量自動釋放的物件時,會占用大量記憶體資源。因此,你需要避免將大量物件自動釋放。並且,在以下兩種情況下,你需要手動建立並手動銷毀掉自動釋放池:

1.當你在主線程外開啟其它執行緒時:系統只會在主線程中自動生成並銷毀掉自動釋放池。

2.當你在短時間內製造了大量自動釋放物件時:及時地銷毀有助於有效利用ipad上有限地記憶體資源。

所以,本人不建議使用autorelease的機制,如果遇到上面例子的情況,使用典型的解決方法吧,外部乙個物件負責刪除obj物件,防止記憶體洩露。

自動釋放池

自動釋放池是什麼時候建立的?又是什麼時候銷毀的?原題 思考 1,有返回值的類方法建立出來的物件都是autorelease的。autorelease物件出了作用域後,就會被新增到自動釋放池中。如果largenumber非常大,有可能在乙個for中就把自動釋放池填滿,記憶體消耗非常大!2,解決方案 在f...

自動釋放池

autorelease本質上就是延遲呼叫release方法 autorelease物件什麼時候釋放?引用計數為0的時候才會釋放,不是出了pool就釋放 在一些很消耗記憶體的迴圈呼叫的場景下有時需要手動干預autoreleased物件的釋放時機,不然會導致記憶體暴增,最終導致程式崩潰 nsthread...

自動釋放池

自動釋放池是允許你放棄對乙個物件的持有關係,但可以避免它立即被 的乙個工具,當從方法返回你的物件的時候,這個功能很有用。1 程式的入口處於在main 函式 這就意味著整個應用都在自動釋放池中,所有的物件最後都會被 int main int argc,char argv 2 autoreleasepo...