一、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,程式報錯
②再次重寫dealloc,通過列印語句驗證ARC是否起作用![]()
OC記憶體管理(ARC) ③通過運作結果可知,ARC幫助我們管理了記憶體![]()
OC記憶體管理(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