------- 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