關於NSAutoReleasePool的理解

轉載自:http://eleda.iteye.com/blog/1108700

        今天需要記錄的是關於NSAutoReleasePool的理解.(大部分內容來自於iOS4.3 Library) 

        Cocoa的內存管理主要依賴於Reference Counting, 而NSAutoReleasePool就是用來支持它的. autorelease pool中存放的對象會在其自身乾枯(drain)時被release.

        我們都知道當一個object的release方法被觸發時, 這個對象就被銷燬了, 再也不能對它有任何引用, 否則就會出現異常. 但如果在銷燬它時觸發的是autorelease方法, 那這個object就進入了對應的autorelease pool, 它的生命就被延長了(當pool drain時才真正被銷燬).

        在Reference Counting的環境裏, Cocoa總是期望在每一個thread都存在一個autorelease pool, 如果不存在, 那些被autoreleased的objects就不會被銷燬, 從而產生memory leak. (印象中這種情況下xcode會在console打出warnning信息)

        NSAutoReleasePool的初始化與普通的NSObject一樣, 都是alloc+init, 不過pool不能被retain, 因爲在drain的時候默認就銷燬它自身了. 還有一點需要注意的是, 通常在銷燬pool的時候用的不是它的release方法, 而是drain! 原因是爲了讓程序同時兼容Reference Counting內存管理環境 與 Garbge Collection環境, 因爲在Garbage Colloection環境中drain的作用是觸發collect garbage動作.

        一般來說在應用的main thread中, 已經存在了一個autorelease pool. 有兩種情況需要開發者自己新建autorelease pool:

  1. 在main thread中, 在某個方法中出現大量的autoreleased objects, 爲了避免memory footprint的增大, 可以手動創建一些autorelease pool用來drain objects.
  2. 創建新的thread, 並在其中訪問了Cocoa, 需要在訪問的前創建autorelease pool, 訪問結束後drain.

最後一點, 在每個thread中都會維持一個stack, 其中放置着所有在這個thread中創建但未銷燬的pool, 每當一個新的pool創建後, 它就位於stack的最頂端,  相應autoreleased object就會放入其中. 當pool drain的時候, 它就會從stack的頂端移除, 並且release掉其包含的objects.

發佈了22 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章