nonatomic:非原子性訪問穆端,不加同步袱贮,多線程并發(fā)訪問會提高性能。如果不加此屬性徙赢,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問字柠。
(atomic是Objc使用的一種線程保護技術(shù),基本上來講狡赐,是防止在寫未完成的時候被另外一個線程讀取窑业,造成數(shù)據(jù)錯誤。而這種機制是耗費系統(tǒng)資源的枕屉,所 以在iPhone這種小型設(shè)備上常柄,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇搀擂。)
assign: 簡單賦值西潘,不更改索引計數(shù)
對基礎(chǔ)數(shù)據(jù)類型 (NSInteger)和C數(shù)據(jù)類型(int, float, double, char, 等)
copy:建立一個索引計數(shù)為1的對象,然后釋放舊對象
對NSString
retain:釋放舊的對象哨颂,將舊對象的值賦予輸入對象喷市,再提高輸入對象的索引計數(shù)為1
對其他NSObject和其子類
copy與retain的區(qū)別:
copy是創(chuàng)建一個新對象,retain是創(chuàng)建一個指針威恼,引用對象計數(shù)加1品姓。
eg:? 一個NSString 對象,地址為0×1111 箫措,內(nèi)容為@”STR”
Copy 到另外一個NSString 之后腹备,地址為0×2222 ,內(nèi)容相同斤蔓,新的對象retain為1 植酥,舊有對象沒有變化
retain 到另外一個NSString 之后,地址相同(建立一個指針,指針拷貝)友驮,內(nèi)容當(dāng)然相同漂羊,這個對象的retain值+1
也就是說,retain 是指針拷貝喊儡,copy 是內(nèi)容拷貝
為什么不能直接調(diào)用dealloc而是release
dealloc不等于C中的free拨与,dealloc并不將內(nèi)存釋放,也不會將索引計數(shù)(Reference counting)降低艾猜。于是直接調(diào)用dealloc反而無法釋放內(nèi)存。
在Objective-C中捻悯,索引計數(shù)是起決定性作用的匆赃。
strong 和weak
iOS 5 中對屬性的設(shè)置新增了strong 和weak關(guān)鍵字來修飾屬性(iOS 5 之前不支持ARC)
strong 用來修飾強引用的屬性;
@property (strong) SomeClass * aObject;
對應(yīng)原來的
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;
weak 用來修飾弱引用的屬性今缚;
@property (weak) SomeClass * aObject;
對應(yīng)原來的
@property (assign) SomeClass * aObject;
@property內(nèi)存管理策略的選擇
1.非ARC
1> copy :只用于NSString\block算柳;
2> retain :除NSString\block以外的OC對象;
3> assign :基本數(shù)據(jù)類型姓言、枚舉瞬项、結(jié)構(gòu)體(非OC對象),當(dāng)2個對象相互引用何荚,一端用retain囱淋,一端???????? ????????? ? 用assign。
2.ARC
1> copy :只用于NSString\block餐塘;
2> strong :除NSString\block以外的OC對象妥衣;
3> weak :當(dāng)2個對象相互引用,一端用strong戒傻,一端用weak税手;代理
4> assgin :基本數(shù)據(jù)類型、枚舉需纳、結(jié)構(gòu)體(非OC對象)芦倒、布爾值。