iOS-ARC

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

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

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

1.自己生成的對象,自己持有。

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

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

4.非自己持有的對象無法釋放。

  • 自己生成的對象,自己持有

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

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

/*

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

*/

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

[object release];

/*

*釋放使用release

*/
  • 無法釋放非自己持有的對象

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

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

__strong 修飾符

__weak 修飾符

__unsafe unretained 修飾符

__autoreleasing 修飾符

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

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

  • __autoreleasing 修飾符

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

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


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

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

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

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