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,不需要加_ _。
(參考傳智如意大師!)