@property 修飾符
修飾符的作用都是針對(duì)系統(tǒng)生成的getter烤蜕、setter方法芥映,對(duì)于自定義getter、setter的對(duì)象只能起到參考的作用贩猎,直接使用(_變量名)同樣不受關(guān)鍵字的影響澎语。
關(guān)鍵字 | 基本類(lèi)型 | Objective-C對(duì)象 | Block | Core Foundation對(duì)象 |
---|---|---|---|---|
assign | √ | √ | √ | √ |
weak | √ | √ | ||
strong | √ | √(=copy) | ||
retain | √ | √(warning) | ||
copy | √ | √ | ||
atomic | √ | √ | √ | √ |
noatomic | √ | √ | √ | √ |
注:對(duì)于Objective-C對(duì)象途事,Block,strong為默認(rèn)修飾符,其他類(lèi)型默認(rèn)用assign修飾擅羞,assgin,strong不可共存尸变。
基本類(lèi)型int,float祟滴,double等
- 基本類(lèi)型不受ARC管理振惰,由系統(tǒng)自動(dòng)回收棧內(nèi)存歌溉。
- 用assign作為屬性默認(rèn)值垄懂,即getter、setter不做任何多余處理痛垛。
- 默認(rèn)支持線程保護(hù)草慧,保護(hù)getter、setter的完整性匙头。
Objective-C對(duì)象
- Objective-C對(duì)象受到ARC管理漫谷,根據(jù)引用計(jì)數(shù)自動(dòng)回收內(nèi)存。
- assign與weak
- 相同點(diǎn):不增加引用計(jì)數(shù)
- 不同點(diǎn):weak引用計(jì)數(shù)為0時(shí)會(huì)把指針指向nil蹂析,assgin會(huì)產(chǎn)生野指針舔示。
- strong與retain
- 特點(diǎn):引用計(jì)數(shù)都增加+1,對(duì)于Objective-C對(duì)象strong=retain,但是對(duì)于Block不同,下面再說(shuō)电抚。
- copy
- copy比較復(fù)雜,先說(shuō)一下我理解copy的語(yǔ)意惕稻,對(duì)于用copy修飾的對(duì)象。在setter中賦值a = b時(shí)候是有替換為a = [b copy]蝙叛,即調(diào)用copy方法俺祠。如果該對(duì)象沒(méi)有copy方法或者沒(méi)有實(shí)現(xiàn)NSCopying協(xié)議,使用該修飾符可以通過(guò)編譯,但在運(yùn)行時(shí)會(huì)報(bào)錯(cuò)蜘渣。而對(duì)于某些NSMutable對(duì)象淌铐,例如:
NSMutableArray *a = [[NSMutableArray alloc]init];
NSMutableArray *b = [a copy];
- 由于copy方法的特性返回的對(duì)象實(shí)際上是不可修改的,實(shí)際上就是NSArray對(duì)象蔫缸。
NSArray對(duì)象沒(méi)有addObject腿准,removeAll等方法,如果調(diào)用到必然出現(xiàn)運(yùn)行時(shí)錯(cuò)誤拾碌。
對(duì)于NSString的copy方法有些特殊释涛,例如:
@property (copy) NSString *copyStr;
NSMutableString *mStr = [NSMutableString stringWithString:@"string"];
self.copyStr = self.mStr;
[self.name2 appendString:@"11122"];
這時(shí)copyStr是“string11122”還是“string”?倦沧?唇撬?
為了處理這個(gè)特殊性,NString copy會(huì)檢查一下參數(shù)類(lèi)型是不是可變的展融。
如果是可變的窖认,進(jìn)行深拷貝。
如果不是可變的告希,進(jìn)行淺拷貝效果與用strong修飾相同扑浸。
- 默認(rèn)支持線程保護(hù),保護(hù)getter燕偶、setter的完整性喝噪。
Block
Block受到ARC管理,但于Objective-C對(duì)象有所不同指么,由系統(tǒng)自動(dòng)回收內(nèi)存酝惧。
雖然上面的修飾符都可以用并且通過(guò)編譯,但retain會(huì)出現(xiàn)警告伯诬,提示用copy替換晚唇。
- 以下是個(gè)人理解可能有誤,歡迎指正盗似。
- block比較復(fù)雜創(chuàng)建的時(shí)候是在棧中哩陕,運(yùn)行的時(shí)候如果沒(méi)有捕獲對(duì)象就在棧中運(yùn)行,如果有捕獲對(duì)象就先copy到堆中運(yùn)行赫舒。
- assign悍及,weak,retain,strong接癌,copy
- 都不會(huì)增加引用計(jì)數(shù)心赶,block的引用計(jì)數(shù)始終為1。
- 不管用那個(gè)關(guān)鍵字修飾可能內(nèi)部實(shí)現(xiàn)都是一樣的扔涧。
- 但是為了更加符合語(yǔ)義推薦使用copy關(guān)鍵字园担。
- 默認(rèn)支持線程保護(hù)届谈,保護(hù)getter、setter的完整性弯汰。
- 關(guān)于block更詳細(xì)的介紹可以參考點(diǎn)擊這里
Core Foundation對(duì)象
- Core Foundation對(duì)象不受ARC管理艰山,需要使用CFRetain CFRelease手動(dòng)管理內(nèi)存。
- 用assign作為屬性默認(rèn)值
- 默認(rèn)支持線程保護(hù)咏闪,保護(hù)getter曙搬、setter的完整性。