Property常用的屬性
1. readwrite 產(chǎn)生setter\getter?方法
2. readonly 只產(chǎn)生簡(jiǎn)單的getter,沒(méi)有setter, 默認(rèn)的讀寫(xiě)屬性
3. setter 指定生成setter?法的名字
4. getter 指定生成getter方法的名字
5. assign 默認(rèn)類(lèi)型,setter方法直接賦值,而不進(jìn)?retain操作,適?于基本數(shù)據(jù)類(lèi)型, 對(duì)象類(lèi)型, 不會(huì)發(fā)?生引用計(jì)數(shù)變化
6. retain setter方法對(duì)參數(shù)進(jìn)?行release舊值,再retain新值
7. copy setter方法進(jìn)?行Copy操作,與retain一樣
8. atomic 保證多線程訪問(wèn)下的安全,但浪費(fèi)系
nonatomic 禁?多線程,變量保護(hù),提高性能
常用場(chǎng)景
1.copy 使用類(lèi)型 :NSString,block
2.assign使用類(lèi)型 :delegate,int,float,NSInteger,bool,枚舉,結(jié)構(gòu)體...
3.retain使用類(lèi)型 :NSArray,NSDate
4.strong使用類(lèi)型 :NSString/block以外的OC對(duì)象
5.weak 使用類(lèi)型 :當(dāng)2個(gè)對(duì)象相互引用,一端用strong,一端用weak;
6.readOnly :只讀時(shí)候(即只需要getter方法的時(shí)候);
readWriete :默認(rèn)屬性(getter&&setter方法)
屬性中的修飾詞 :
assign ( ARC/MRC )
1:assign用于值類(lèi)型,如int、float、double和NSInteger,CGFloat等表示單純的復(fù)制。還包括不存在所有權(quán)關(guān)系的對(duì)象,比如常見(jiàn)的delegate。.
2.當(dāng)然其實(shí)對(duì)象也可以用 assign 修飾 , 只是對(duì)象的計(jì)數(shù)器不會(huì)+1 . ( 與 strong 的區(qū)別 )
3.如果用來(lái)修飾對(duì)象屬性 , 那么當(dāng)對(duì)象被銷(xiāo)毀后指針是不會(huì)指向 nil 的 . 所以會(huì)出現(xiàn)野指針錯(cuò)誤 . ( 與weak的區(qū)別 )
weak ( ARC )
1.弱指針是針對(duì)對(duì)象的修飾詞 , 就是說(shuō)它不能修飾基本數(shù)據(jù)類(lèi)型 .
2.weak 修飾的對(duì)象計(jì)數(shù)器不會(huì)+1 , 也就是直接賦值 .
3.弱引用是為打破循環(huán)引用而生的 .
4.它最被人所喜歡的原因是 它所指向的對(duì)象如果被銷(xiāo)毀 , 它會(huì)指向 nil . 而 nil 訪問(wèn)什么鬼都不會(huì)報(bào)野指針錯(cuò)誤 .
strong ( ARC )
1.直接賦值并且計(jì)數(shù)器 +1 .
2.在 ARC 里替代了 retain 的作用 .
retain ( MRC )
1.release 舊對(duì)象( 舊對(duì)象計(jì)數(shù)器 -1 ) , retain 新對(duì)象( 新對(duì)象計(jì)數(shù)器 +1 ) , 然后指向新對(duì)象 .
2.在set方法里面是這樣的 :
if (_delegate) {
[_delegate release];
}
_delegate = [delegate retain];
copy ( ARC/MRC )
1.copy 在 MRC 時(shí)是這樣做的 release 舊對(duì)象( 舊對(duì)象計(jì)數(shù)器 -1 ) , copy 新對(duì)象( 新對(duì)象計(jì)數(shù)器 +1 ) , 然后指向新對(duì)象 .
1.1在set方法里面是這樣的 :
if (_delegate) {
[_delegate release];
}
_delegate = [delegate copy];
2.copy 在 ARC 時(shí)是這么干的 copy 新對(duì)象( 新對(duì)象計(jì)數(shù)器 +1 ) , 然后指向新對(duì)象 .
2.1在set方法里面是這樣的 :
_delegate = [delegate copy];
3.使用注意 :
3.1 修飾的屬性本身要不可變的 . 例如 NSMutableArray 采用 copy 修飾 , 添加元素表面上可以 一到運(yùn)行就崩潰了 , 因?yàn)?copy 過(guò)后實(shí)際上成了NSArray了 . ( 隊(duì)友 , 我們不吭你 )
3.2 遵守 NSCopying 協(xié)議的對(duì)象使用 .
nonatomic ( ARC/MRC )
1.不對(duì)set方法加鎖 .
2.性能好
3.線程不安全
atomic ( ARC/MRC )
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ì)有問(wèn)題的 . 所以即使用了 atomic 修飾 還是不夠安全 .
readonly
1.讓 Xcode 只生成get方法 .
2.不想把暴露的屬性被人隨便替換時(shí) , 可以使用 .
readwrite
1.讓 Xcode 生成get/set方法 .
2.不用 readonly 修飾時(shí) , 默認(rèn)就是 readwrite .
getter/setter 的自定義方法名 .
1.一般對(duì)于 有/無(wú) 是/否 等這樣的屬性 , getter 方法名前面加個(gè) is 會(huì)顯得通俗易懂 .