ARC

隨着ios5以後,ARC的模式已經成了主流。前面咱們知道ARC會自動幫助開發者去插入retain和release語句。ARC編譯器有兩個部分,分別爲前端編譯器和ARC優化器。前端

1. 前端編譯器ios

前端編譯器會爲「擁有的」對象插入相對的release語句。若是對象的全部權修飾符是strong,那麼它就是被擁有的。oop

a.若是在某個方法內去建立一個對象,前端編譯器會在方法末尾自動插入release語句來銷燬它。性能

b.對於類擁有的對象(實例變量/屬性)會在dealloc方法裏釋放。事實上咱們並不須要去寫dealloc方法或者調用dealloc方法,ARC會自動幫你完成一切的。此外由ARC的編譯器生成的代碼甚至比咱們寫的release語句的性能還要好,由於編譯器能夠作出假設,在ARC中,沒有類能夠覆蓋release方法,也沒有調用它的必要。ARC會經過直接使用objc_release來優化調用過程。而對retain也是一樣的方法,ARC會調用objc_retain來取代保留消息。優化

2.ARC優化器spa

雖然ARC前端編譯器聽起來很NB的樣子,可是代碼中有時仍然會出現幾個對retain和release的重複調用。ARC優化器負責移除多餘的retain和release語句,確保生成的代碼運行速度高於手動引用計數的代碼。code

 

--------------------------------------------------------------------- 分割線 ---------------------------------------------------------------對象

前面說的是ARC的原理,下面咱們看自動釋放的對象具體到何時釋放?(真正的釋放機制)開發

The autoreleased objects will be deallocated when, the closest enclosing autorelease pool on the stack of the thread on which the -autorelease message has been sent, gets drained or released.get

對於每一個Runloop,系統都會隱式去建立一個Autorelease pool,這樣全部的release pool會構成一個相似於CallStack同樣的棧式結構,在每個Runloop結束時候,當前棧頂的Autorelease pool會被銷燬,這樣這個pool裏的每一個object都會被release。

 

在起用ARC的項目中,添加不須要使用ARC的文件,在compiler flags中加-fno-objc-arc標識

在未起用ARC的項目中,添加須要使用ARC的文件,在compiler flags中加-fobjc-arc標識

相關文章
相關標籤/搜索