ARC機制,arc

來源:互聯網
上載者:User

ARC機制,arc

ARC概念及原理 

1、瞭解指標分類 

(1)強指標:預設的情況下,所有的指標都是強指標,關鍵字strong (2)弱指標:_ _weak關鍵字修飾的指標
聲明一個弱指標如下:
  _ _weak Person *p; 

2、什麼是ARC? 

   Automatic Reference Counting,自動引用計數,即ARC,可以說是WWDC2011和iOS5所引入 的最大的變革和最激動人心的變化。ARC是新的LLVM 3.0編譯器的一項特性,使用ARC,可以說一 舉解決了廣大iOS開發人員所憎恨的手動記憶體管理的麻煩。在工程中使用ARC非常簡單:只需要像往常那樣編寫代碼,retain,release autorelease~這是ARC的基本原則。 

  當ARC開啟時,編譯器將自動在代碼合適的地方插入retain, releaseautorelease,而作為 開發人員,完全不需要擔心編譯器會做錯(除非開發人員自己錯用ARC了)。 

手動管理記憶體可以簡稱MRC (Manual Reference Counting) 

  ARC與其他語言的”記憶體回收”機制不同。ARC:編譯器特性:“記憶體回收”運行時特性

  只要某個對象被任一strong指標指向,那麼它將不會被銷毀 

3、ARC工作原理及判斷準則 

  ARC是Objective-C編譯器的特性,而不是運行時特性或者記憶體回收機制,ARC所做的只不過是 在代碼編譯時間為你自動在合適的位置插入release或autorelease, 

  ARC的判斷準則: 只要沒有強指標指向對象,對象就會被釋放。 

  注意:當使用ARC的時候,暫時忘記“引用計數器”,因為判斷標準變了

 

1)強指標 所有的指標預設就是強指標 

強指標使用__strong 標識 

2)弱指標 所有的指標預設就是強指標 

弱指標使用__week 標識 

 

ARC下循環參考問題 

person.h 

#import <Foundation/Foundation.h> @class Dog;
@interface Person : NSObject 

//dog是strong 強指標
@property (nonatomic,strong) Dog *dog; 

@end 

person.m 

#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
//狗的主人 也是strong 強指標
@property (nonatomic,strong) Person *owner; @end 

main.m 

Person *p = [Person new]; Dog *d = [Dog new]; 

 

p.dog = d,仍然能夠正常釋放 

 

當增加d.owner = p;時形成循環參考 

 

造成迴圈引入 

解決方案:
迴圈引入的對象中其中一個對象設定為strong 另一個設定為weak 

 

ARC下@property參數 

ARC中的@property
strong : 用於OC對象, 相當於MRC中的retain
weak : 用於OC對象, 相當於MRC中的assign
assign : 用於基礎資料型別 (Elementary Data Type), 跟MRC中的assign一樣
copy : 一般用於NSString, 跟MRC中的copy一樣 在ARC情況下解決”迴圈retain”的問題:@property一邊用strong,一邊用weak 

 

ARC使用特點及注意事項 

1、ARC特點總結 

(1)不允許調用release,retain,retainCount

(2)允許重寫dealloc,但是不允許調用[super dealloc]

(3)@property的參數: 

strong:相當於原來的retain(適用於OC物件類型),成員變數是強指標

weak:相當於原來的assign,(適用於oc物件類型),成員變數是弱指標 assign:適用於非OC物件類型(基礎類型) 

2、ARC使用注意事項 

1)ARC中,只要弱指標指向的對象不在了,就直接把弱指標做清空(賦值為nil)操作。

2)__weak Person *p=[[Person alloc] init];//不合理,對象一建立出來就被釋放掉,對象釋 放掉後,ARC把指標設定為nil。

3)ARC中在property處不再使用retain,而是使用strong,在dealloc中不需要再
[super dealloc]。
@property(nonatomic,strong)Dog *dog;
// 意味著產生的成員變數_dog是一個強指標,相當於以前的retain。

4)如果換成是弱指標,則換成weak,不需要加_ _。 

 (參考傳智如意大師!)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.