天天看點

OC記憶體管理(ARC)

一、ARC的判斷準則

    隻要沒有強指針指向對象,對象就會被釋放。

    代碼示例:    

Person *p = [[Person alloc] init];
p = nil;
           

           代碼解析:預設情況下,p是強指針。當p等于空時,就沒有強指針指向Person對象,這時候編譯器會自動将Person對象銷毀。

二、指針分類

    1.強指針:預設的情況下,所有的指針都是強指針,關鍵字strong

    2.弱指針:_ _weak關鍵字修飾的指針

      聲明一個弱指針如下:

__weak Person *p;
           

            ARC中,隻要弱指針指向的對象不在了,就直接把弱指針做清空操作(nil指針)。

__weak Person *p=[[Person alloc]  init];//不合理,對象一建立出來就被釋放掉,對象釋放掉後,ARC把指針自動清零。

ARC中在property處不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。

@property(nonatomic,strong)Dog *dog;  // 意味着生成的成員變量_dog是一個強指針,相當于以前的retain。

如果換成是弱指針,則換成weak,不需要加__

三、ARC的特點總結

    1.不允許調用release,retain,retainCount 

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

    [email protected]的參數:

Strong:相當于原來的retain(适用于OC對象類型),成員變量是強指針

Weak:相當于原來的assign,(适用于oc對象類型),成員變量是弱指針

Assign:基本資料類型,直接指派。(适用于非OC對象)

    4.手動管理記憶體的retain,全部改為strong,其餘不變 

例如:@property (nonatomic, retain) Car *car;

改為:@property (nonatomic, strong) Car *car;

四、控制ARC功能的開關

    1.點選目前project最上的設定檔案

OC記憶體管理(ARC)

    2.在右邊的設定選項裡找到ARC做出修改(找不到可以搜尋ARC)

OC記憶體管理(ARC)

    注意:

1)在ARC模式下,release 、retain 、retainCount 、autorelease 都是不能調用的。

2)在ARC模式下,不能使用[super dealloc];

~驗證ARC回收對象機制

①若想在ARC重寫dealloc中調用父類的dealloc,程式報錯

OC記憶體管理(ARC)
②再次重寫dealloc,通過列印語句驗證ARC是否起作用
OC記憶體管理(ARC)
③通過運作結果可知,ARC幫助我們管理了記憶體
OC記憶體管理(ARC)

五、解決循環引用

1.ARC

    一端用strong,一端用weak

Dog 端 : @property (nonatomic,strong)   Person *person;

Person端:@propertor (nonatomic,weak) Dog *car

OC記憶體管理(ARC)

2.非ARC

    一端用retain,一端用assign

Dog 端 : @property (nonatomic,retain)   Person *person;

Person端:@propertor (nonatomic,assign) Dog *car

    ★注:字元串是特殊的對象,但不需要使用release手動釋放,這種字元串對象預設就是autorelease的,不用額外的去管記憶體

參考:https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html