ARC:assign牡彻、weak、strong出爹、copy
MRC:assign庄吼、retain、copy严就、nonatomic总寻、atomic
assign :??賦值
1.直接賦值,例如:int, float...等使用
2.沒用使用其他(weak, strong,copy,retain)時(shí)梢为,默認(rèn)為assign修飾
3.對(duì)象使用assign渐行,計(jì)數(shù)器不會(huì)+1(與strong的區(qū)別)轰坊;當(dāng)對(duì)象銷毀時(shí),指針不指向nil祟印,會(huì)出現(xiàn)野指針(與weak的區(qū)別)
weak:弱
1.弱指針肴沫,修飾對(duì)象使用,不可用于數(shù)據(jù)類型(int蕴忆,float...)
2.weak修飾時(shí)颤芬,計(jì)數(shù)器不會(huì)+1,直接賦值
3.weak是為了打破循環(huán)應(yīng)用而生套鹅,常用于修飾Block站蝠,不會(huì)對(duì)block內(nèi)的使用對(duì)象的引用計(jì)數(shù)+1,因此不會(huì)導(dǎo)致內(nèi)存泄漏
4.他的引用對(duì)象被銷毀時(shí)卓鹿,指針會(huì)指向nil菱魔,不會(huì)出現(xiàn)野指針
strong:強(qiáng)
1.強(qiáng)指針,直接賦值吟孙,并且計(jì)數(shù)器+1
2.在ARC中代替了retain的作用
retain:保持
1.release 舊對(duì)象( 舊對(duì)象計(jì)數(shù)器 -1 ) , retain 新對(duì)象( 新對(duì)象計(jì)數(shù)器 +1 ) , 然后指向新對(duì)象 .
2.set方法如下:
if(_some != nil){
? ? [_some release];
};
_some = [some retain];
copy:拷貝
1.copy 在 MRC 時(shí)是這樣做的 release 舊對(duì)象( 舊對(duì)象的引用計(jì)數(shù)器 -1 ) , copy 新對(duì)象( 新對(duì)象的引用計(jì)數(shù)器 +1 ) , 然后指向新對(duì)象 .(新對(duì)象是指最終指向的那個(gè)對(duì)象澜倦,不管深拷貝還是淺拷貝)
if (_dog != nil)
{
[_dog release];
}
_dog = [dog copy];
2.copy 在 ARC 時(shí)是這么干的 copy 新對(duì)象( 新對(duì)象的引用計(jì)數(shù)器 +1 ) , 然后指向新對(duì)象?
_dog = [dog copy];
3.修飾的屬性本身要不可變的。例如 NSMutableArray 采用 copy 修飾 , 在addObject時(shí)會(huì)出現(xiàn)Crash拔疚, 因?yàn)?b>NSMutableArray的對(duì)象在copy 過后就會(huì)變成NSArray肥隆。如果需要copy NSMutableArray對(duì)象,用:mutablecopy稚失。
nonatomic:非原子屬性
1.不對(duì)set方法加同步鎖 .
2.性能好
3.線程不安全
atomic :原子屬性
1.原子屬性就是對(duì)生成的 set 方法加互斥鎖 @synchronized(鎖對(duì)象) .
@synchronized(self) { _delegate = delegate;}
2.需要消耗系統(tǒng)資源 .
3.互斥鎖是利用線程同步實(shí)現(xiàn)的 , 意在保證同一時(shí)間只有一個(gè)線程調(diào)用 set 方法 .
4.其實(shí)還有 get 方法 , 要是同時(shí) set 和 get 一起調(diào)用還是會(huì)有問題的 . 所以即使用了 atomic 修飾 還是不夠安全 .
readonly (只讀)
1.讓 Xcode 只生成get方法 .
2.不想把暴露的屬性被人隨便替換時(shí) , 可以使用 .
readwrite (讀寫)(默認(rèn))
1.讓 Xcode 生成get/set方法 .
2.不用 readonly 修飾時(shí) , 默認(rèn)就是 readwrite .