黑馬程序員——IOS基礎——OC內存管理ARC

------- android培訓java培訓、期待與您交流!

ARC的判斷準則

只要有強指針指向對象,對象就不會被銷燬,

只要有弱指針指向對象,對象就會被銷燬

強指針:默認情況下,所有指針都是強指針 __strong  這裏是雙下劃線
弱指針:  __weak Person *p2=[[Person alloc] init]; (這種寫法沒有意義,錯誤寫法)

如果弱指針指向一個對象,那麼這個對象會被銷燬,弱指針指向對象不存在,把弱指針編程空指針,以防野指針

atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操作。

設置成員變量的@property屬性時,默認爲atomic,提供多線程安全。

在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函數會變成下面這樣:
                        {lock}//加鎖
                                if (property != newValue) { 
                                        [property release]; 
                                        property = [newValue retain]; 
                                }
                        {unlock}//解鎖
atomic是OC使用的一種線程保護技術,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤,而這種機制是耗費系統資源的。 
nonatomic禁止多線程,變量保護,提高性能。

所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那麼nonatomic是一個非常好的選擇。


@property (nonatomic strong) Dog *dog;  //人在狗在
@property (nonatomic weak) Dog *dog;  //
Dog *d = [[Dog alloc] init];
Person *p = [[Person alloc] init];
p.dog = d;
//如果是strong,則d=nil後,依然可以調用p.dog   如果是weak,則d=nil後,狗就不在了,則訪問p.dog返回空
d = nil;  //人在狗在用strong
總結ARC特點總結:
1.>不允許調用release、retain、retainCount
2.>允許重寫dealloc,但是不允許調用[super dealloc]
3.>@property參數:
* strong :成員變量是強指針,相當於原來的retain(適用於OC對象類型),只要指針在,對象就在
* weak :成員變量是弱指針,相當於原來的assign(適用於OC對象類型)
* assign :使用與非OC對象類型 
4.>以前的retain改爲用strong
寫法如下:
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;

如何:查看一個項目是否是ARC項目:在Build Settings 中搜auto,

如何:把一個項目轉換成ARC項目:把所有release去掉,把retain變成strong

edit -> refactor -> convert to Object-C ARC
如何:在一個ARC項目中不使用ARC:
在Build Phases中:找到不適用ARC的文件,雙擊/空格/回車 出現方框,輸入:-fno-objc-arc
如何:在一個非ARC項目中使用ARC:

方法同上:輸入:-f-objc-arc

===============================ARC循環引用=============================

在Person.h  和  Dog.h 中不能都聲明strong:

@property (nonatomic, strong) Dog *dog;

@property (nonatomic, strong) Person *person;

一端用strong,一端用weak,不限制誰用weak,這樣弱指針指向的對象會先銷燬,另一端若沒有指針指向,則也會銷燬。

@property (nonatomic, strong) Dog *dog;

@property (nonatomic, weak) Person *person;


所以,當兩端循環引用的時候,解決方案:

ARC:

1端用strong,1端用weak

非ARC:

1端用retain,1端用assign

------- android培訓java培訓、期待與您交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章