iOS開發系列-ARC淺解

1、什麼是 ARC ?

所謂ARC就是Automatic Reference Counting , 即自動引用計數。ARC是自iOS5引入的。ARC機制的引入是爲了簡化開發過程的內存管理的。相對於以前的MRC (Manual Reference Counting) , ARC機制顯得更加自動化。在使用ARC開發過程當中,開發者只需考慮strong / weak 的使用,再也不須要考慮對象什麼時候要retain,release/autorealease。使用ARC通常不會下降程序的效率。ios

2、ARC的工做原理

ARC一個很重要的原則是:只要某個對象被任一strong指針指向,那麼它將不會被銷燬。若是對象沒有被任何strong指針指向,那麼就將被銷燬spa

ARC是基於引用計數的,當某個對象被一個strong指針指向時,它的計數+1。當沒有strong指針指向時,其計數爲0,此時對象會被銷燬。只要一個對象有至少一個strong指針指向時,它就不會被銷燬。但ARC容易形成一個 Strong Reference Cycle 的問題,這樣即便AddBook 和 Entry 這兩個對象都再也不使用了,可是因爲ARC機制,這兩個對象都互相有strong指針指向,因此這兩個對象都不會被回收,從而形成內存沒法被釋放。指針

針對上面的狀況,有一種解決方法:在其中一個對象中引入weak,替換其strongcode

引入weak後,當entry使用完後,因爲指向AddrBook沒有strong指針,因此AddrBook會首先被釋放,而後因爲AddrBook被釋放,指向Entry的Strong指針也會銷燬,此時沒有指向Entry的strong指針,因此Entry也會被釋放。這樣就不會出現內存沒法被釋放的狀況。對象

這裏就有一個問題了,何時應該用strong,何時應該用weak呢?看如下解析:blog

如圖所示,ViewController直接持有View,因此ViewController應該要有一個strong指向view。同理,view直接持有subviews,因此也應該要有strong指向subviews。因爲viewcontroller要使用subviews對象,但又不想直接持有subviews,因此只好經過weak指向subviews。這樣的話,能夠在viewcontroller中不改變view的持有關係,就能夠使用subviews對象。從圖中能夠得出一個通用的規律:對於有直接持有的關係,持有者要經過strong指向被持有者。對於有間接持有關係的,間接持有者需經過weak指向間接被持有者。內存

 

參考文章:http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2開發

        http://onevcat.com/2012/06/arc-hand-by-hand/get

相關文章
相關標籤/搜索