---為什麼會有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方法時,會将這個對象放到位于棧頂的釋放池中