readwrite, readonly, assign, retain, copy, nonatomic, atomic是什么作用, 在那種情況下用
-
readwrite
- 可讀可寫特性, 需要生成setter和getter方法時(shí)使用, 可被外界讀取和修改
-
readonly
- 只讀特性, 只會(huì)生成getter方法, 只可被外界讀取, 不能修改
-
assign
- 賦值特性, 作用于非OC對(duì)象的賦值, setter方法將參數(shù)傳給變量
-
retain
-
持有特性, 他的setter方法會(huì)釋放舊址, 然后引用住新值, 并且將新值的引用計(jì)數(shù)+1, 只能作用于OC對(duì)象(基本數(shù)據(jù)類型和Core Foundation對(duì)象沒有引用計(jì)數(shù)的概念, 因此不能用retain)
- (void)setName:(NSString *)newName { if (name != newName) { [name release]; name = [newName retain]; // name’s retain count has been bumped up by 1 } }
-
-
copy
- 復(fù)制特性, 此屬性只對(duì)遵守了
NSCopying
協(xié)議的對(duì)象類型有效, 一般作用于NSString, NSArray, NSDictionary等有可變類型的對(duì)象
- 如果copy的是不可變類型, 就不會(huì)開辟新的內(nèi)存空間, 并且為指針拷貝, 指向同一個(gè)內(nèi)存地址: 淺拷貝
- 如果copy的是可變類型, 就會(huì)開辟新的內(nèi)存空間, 并且將內(nèi)容copy下來(lái)單獨(dú)保存: 深拷貝
- 注意: 如果在系統(tǒng)中創(chuàng)建內(nèi)容相同的不可變字符串, 系統(tǒng)會(huì)自動(dòng)做出優(yōu)化, 指向同一塊內(nèi)存空間
- 復(fù)制特性, 此屬性只對(duì)遵守了
-
nonatomic
- 非原子性, 即非線程安全的, 不給變量提供線程鎖保護(hù), 這樣會(huì)提高性能
- 在iOS的移動(dòng)端, 一般不會(huì)出現(xiàn)多線程訪問同一個(gè)屬性的情況, 就算發(fā)生情況, atomic也不能完美的保證安全, 并且還需要手動(dòng)增加線程鎖, 因此對(duì)于變量都應(yīng)該使用nonatomic
-
atomic
- atomic會(huì)給屬性加上一個(gè)同步鎖, 這是為了防止多線程同時(shí)訪問屬性出現(xiàn)異常需要添加的屬性, 但是這樣會(huì)增加額外的內(nèi)存開銷 并且在變編程習(xí)慣中, 我們都應(yīng)該避免多線程訪問統(tǒng)一資源
- 即便是使用atomic, 在多線程時(shí)也無(wú)法完全保證線程安全, 往往是需要手動(dòng)添加線程鎖