iOS-ARC

<b>什么是引用計(jì)數(shù)?</b>

當(dāng)生成一個(gè)對(duì)象的時(shí)候,該對(duì)象的引用計(jì)數(shù)為1,當(dāng)持有者增加時(shí),引用計(jì)數(shù)增加,當(dāng)持有者釋放時(shí),引用計(jì)數(shù)降低。當(dāng)減少到為0時(shí),那么這個(gè)對(duì)象的內(nèi)存塊將會(huì)被釋放。

引用計(jì)數(shù)式內(nèi)存管理的思考方式:

1.自己生成的對(duì)象,自己持有。

2.非自己生成的對(duì)象,自己也能持有。

3.不再需要自己持有的對(duì)象要釋放。

4.非自己持有的對(duì)象無(wú)法釋放。

  • 自己生成的對(duì)象,自己持有

使用 alloc,new,copy,mutableCopy的方法名,意味著自己生成的對(duì)象只有自己持有。

  • 非自己生成的對(duì)象,自己也能持有
//取得非自己生成并持有的對(duì)象
id object = [NSMutableArray array];

/*

*取的對(duì)象存在,但是自己并不持有對(duì)象

*/

[object retain];//自己持有對(duì)象
  • 不再需要自己持有的對(duì)象時(shí)釋放
id object = [[NSMutableArray alloc] init];

[object release];

/*

*釋放使用release

*/
  • 無(wú)法釋放非自己持有的對(duì)象

    對(duì)于用 alloc,new,copy,mutableCopy生成的對(duì)象,在不需要的時(shí)候要用release進(jìn)行釋放。而對(duì)于非自己持有的對(duì)象絕對(duì)不能進(jìn)行釋放,這樣會(huì)造成崩潰。在自己持有的對(duì)象釋放完不再需要的對(duì)象后,不能再次釋放。

<b>ARC有效時(shí)所有類(lèi)型都必須加上所有權(quán)修飾符。所有權(quán)修飾符一共有四種: </b>

__strong 修飾符

__weak 修飾符

__unsafe unretained 修飾符

__autoreleasing 修飾符

  • __strong 修飾符是id類(lèi)型和對(duì)象類(lèi)型默認(rèn)的所有權(quán)修飾符。_strong修飾符表示對(duì)對(duì)象的"強(qiáng)引用"
        /*
         *  obj1持有對(duì)象A的強(qiáng)引用
         */
        id __strong obj1 = [[NSObject alloc] init]; // 對(duì)象A
        /*
         *  obj2持有由obj1賦值的對(duì)象A的強(qiáng)引用
         *  此時(shí),持有對(duì)象A的強(qiáng)引用的變量有 obj1,obj2
         */
        id __strong obj2 = obj1;
    
        /*
         *  obj1對(duì)對(duì)象A的強(qiáng)引用失效
         *  此時(shí),持有對(duì)象A的強(qiáng)引用的變量只有obj2
         */
        obj1 = nil;
        
        /*
         *  obj2對(duì)對(duì)象A的強(qiáng)引用失效
         *  此時(shí),對(duì)象A的所有者不存在,廢棄對(duì)象A
         */
        obj2 = nil;
  • __weak修飾符表示對(duì)對(duì)象的"弱引用",因?yàn)?strong修飾符并不能解決"循環(huán)引用"的問(wèn)題。當(dāng)A對(duì)B進(jìn)行強(qiáng)引用,B對(duì)A進(jìn)行強(qiáng)引用的時(shí)候,AB兩個(gè)對(duì)象將無(wú)法釋放。在用weak持有某對(duì)象的弱引用時(shí),若該對(duì)象被廢棄,那么此弱引用將自動(dòng)失效處于nil被賦值的狀態(tài)。
  id __weak obj1 = nil;
    {
        id __strong obj0 = [[NSObject alloc] init];
        obj1 = obj0;
    }
    /*
     * obj0變量超出作用域,釋放自己所持有的對(duì)象。進(jìn)行廢棄該對(duì)象。
     * obj1變量的弱引用失效,nil賦值給obj1。
     */
  • __unsafe unretained 修飾符

unsafe unretained 修飾符的變量和weak修飾符的變量一樣,自己生成的并持有的對(duì)象不能繼續(xù)為自己持有,所以生成的對(duì)象會(huì)立即被釋放?,F(xiàn)在基本上不使用unsafe unretained 修飾符。

  • __autoreleasing 修飾符

ARC有效不能使用autorelease方法。也不能使用NSAutoreleasePool類(lèi)。但實(shí)際上,ARC有效時(shí)autorelease功能是起作用的。

在ARC無(wú)效與ARC有效的等價(jià)關(guān)系。


等價(jià).png
   @autoreleasepool {
        /*
         * 取得非自己生成并持有的對(duì)象
         */
        id __strong obj = [NSMutableArray array];
    }
    
    /*
     * obj被釋放了
     */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 注:這一文章將是我自己的復(fù)習(xí)整理過(guò)程,僅供參考。(歡迎指出錯(cuò)誤) ARC(Automatic Reference ...
    StrongX閱讀 6,474評(píng)論 17 90
  • Cocoa內(nèi)存管理機(jī)制 (1)當(dāng)你使用new、alloc、copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1.當(dāng)...
    John_LS閱讀 2,879評(píng)論 0 6
  • 本文的內(nèi)容包括 一、所有權(quán)修飾符二、ARC的基本規(guī)則三、ARC的實(shí)現(xiàn) ARC中仍然是通過(guò)引用計(jì)數(shù)來(lái)管理內(nèi)存,這個(gè)本...
    doudo閱讀 562評(píng)論 0 0
  • ARC ARC是什么 ARC是iOS 5推出的新功能,全稱(chēng)叫 ARC(Automatic Reference Co...
    RY_zheng閱讀 1,633評(píng)論 0 9
  • 內(nèi)存管理 引用計(jì)數(shù):Objective-C Python 垃圾收集:C#,Java等 區(qū)別 內(nèi)存管理的基本規(guī)則 自...
    cjnwan閱讀 695評(píng)論 0 0

友情鏈接更多精彩內(nèi)容