天天看點

回顧自動釋放池的使用及個人了解autorelease

---為什麼會有autorelease?

OC的記憶體管理機制中比較重要的一條規律是:誰申請,誰釋放

考慮這種情況,如果一個方法需要傳回一個建立的對象,該對象何時釋放?

方法内部是不會寫release來釋放對象的,因為這樣做會将對象立即釋放而傳回一個空對象;調用者也不會主動釋放該對象的,因為調用者遵循“誰申請,誰釋放”的原則。那麼這個時候,就發生了記憶體洩露。

---不使用autorelease存在的問題

針對這種情況,Objective-C的設計了autorelease,既能確定對象能正确釋放,又能傳回有效的對象。

---使用autorelease的好處

(1)不需要再關心對象釋放的時間

(2)不需要再關心什麼時候調用release

---autorelease用法

(1)會将對象放到一個自動釋放池中

(2)當自動釋放池被銷毀時,會對池子裡的所有對象做一次release

(3)會傳回對象本身

(4)調用完autorelease方法後,對象的計數器不受影響(銷毀時影響)

---autorelease原理:

 //把對release的調用延遲,系統隻是把該 Object放入了當 前的Autorelease pool中,當該pool被釋放時,

// 該pool中的所有Object會被調用Release。

---autorelease何時釋放?

對于autoreleasepool本身,會在如下兩個條件發生時候被釋放 

1)手動釋放Autorelease pool

2)Runloop結束後自動釋放

//對于autoreleasepool内部的對象在引用計數的retainCount== 0的時候釋放。release和autorelease pool 的 drain都會觸發 retain--事件。

------>autorelease 隻是一個标記,表明會延遲釋放 當一個autorelease對象超出自己的作用域後,會被添加到離他最近的autorelease pool中,當pool開始傾倒的時候,會向池裡面所有的對象發送一次release方法,釋放pool中所有的對象。

自動釋放池棧

(1)在iOS程式運作過程中,會建立無數個池子,這些池子都是以棧結構(先進後出)存在的。

(2)當一個對象調用autorelease方法時,會将這個對象放到位于棧頂的釋放池中

繼續閱讀