qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          iOS開(kāi)發(fā)系列-ARC淺解

           一、什么是 ARC ?
            所謂ARC就是Automatic Reference Counting , 即自動(dòng)引用計(jì)數(shù)。ARC是自iOS5引入的。ARC機(jī)制的引入是為了簡(jiǎn)化開(kāi)發(fā)過(guò)程的內(nèi)存管理的。相對(duì)于之前的MRC (Manual Reference Counting) , ARC機(jī)制顯得更加自動(dòng)化。在使用ARC開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者只需考慮strong / weak 的使用,不再需要考慮對(duì)象何時(shí)要retain,release/autorealease。使用ARC一般不會(huì)降低程序的效率。
            二、ARC的工作原理
            ARC一個(gè)很重要的原則是:只要某個(gè)對(duì)象被任一strong指針指向,那么它將不會(huì)被銷(xiāo)毀。如果對(duì)象沒(méi)有被任何strong指針指向,那么就將被銷(xiāo)毀。
            ARC是基于引用計(jì)數(shù)的,當(dāng)某個(gè)對(duì)象被一個(gè)strong指針指向時(shí),它的計(jì)數(shù)+1。當(dāng)沒(méi)有strong指針指向時(shí),其計(jì)數(shù)為0,此時(shí)對(duì)象會(huì)被銷(xiāo)毀。只要一個(gè)對(duì)象有至少一個(gè)strong指針指向時(shí),它就不會(huì)被銷(xiāo)毀。但ARC容易造成一個(gè) Strong Reference Cycle 的問(wèn)題,這樣即使AddBook 和 Entry 這兩個(gè)對(duì)象都不再使用了,但是由于ARC機(jī)制,這兩個(gè)對(duì)象都互相有strong指針指向,所以這兩個(gè)對(duì)象都不會(huì)被回收,從而造成內(nèi)存無(wú)法被釋放。
            針對(duì)上面的情況,有一種解決方法:在其中一個(gè)對(duì)象中引入weak,替換其strong
            引入weak后,當(dāng)entry使用完后,由于指向AddrBook沒(méi)有strong指針,所以AddrBook會(huì)首先被釋放,然后由于AddrBook被釋放,指向Entry的Strong指針也會(huì)銷(xiāo)毀,此時(shí)沒(méi)有指向Entry的strong指針,所以Entry也會(huì)被釋放。這樣就不會(huì)出現(xiàn)內(nèi)存無(wú)法被釋放的情況。
            這里就有一個(gè)問(wèn)題了,什么時(shí)候應(yīng)該用strong,什么時(shí)候應(yīng)該用weak呢?看以下解析:
            如圖所示,ViewController直接持有View,所以ViewController應(yīng)該要有一個(gè)strong指向view。同理,view直接持有subviews,所以也應(yīng)該要有strong指向subviews。由于viewcontroller要使用subviews對(duì)象,但又不想直接持有subviews,所以只好通過(guò)weak指向subviews。這樣的話(huà),可以在viewcontroller中不改變view的持有關(guān)系,就可以使用subviews對(duì)象。從圖中可以得出一個(gè)通用的規(guī)律:對(duì)于有直接持有的關(guān)系,持有者要通過(guò)strong指向被持有者。對(duì)于有間接持有關(guān)系的,間接持有者需通過(guò)weak指向間接被持有者。

          posted on 2014-11-21 10:57 順其自然EVO 閱讀(194) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 測(cè)試學(xué)習(xí)專(zhuān)欄

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 治多县| 白朗县| 汤阴县| 汉阴县| 吉隆县| 丹江口市| 昌都县| 阿荣旗| 庐江县| 安乡县| 永和县| 芮城县| 罗田县| 班戈县| 荃湾区| 临湘市| 隆回县| 怀远县| 信丰县| 潞城市| 高邮市| 农安县| 沿河| 延边| 文安县| 安多县| 南安市| 乐亭县| 汉寿县| 交口县| 防城港市| 霞浦县| 合阳县| 新昌县| 庆城县| 景谷| 繁峙县| 宁国市| 南阳市| 腾冲县| 大埔区|