天天看點

自動釋放池autoreleasepool 自動釋放池autoreleasepool

轉載自:http://blog.csdn.net/hherima/article/details/8776538

自動釋放池autoreleasepool

        自動釋放池是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上有限地記憶體資源。

繼續閱讀