iOS中屬性修飾符
ios中的主要屬性修飾符包含:
- copy
- assign
- retain
- strong
- weak
- readwrite
- readonly
- nonatomic
- atomic
其中在MRC模式中使用的是assign和retain野崇,在ARC中使用的是assign驯用、strong和weak
屬性修飾符詳述
1、copy
copy屬性的目的就是為了改變副本而不去影響源對象
要理解copy屬性以蕴,首先需要理解深拷貝與淺拷貝:
- 深拷貝就是把內(nèi)容拷貝一份產(chǎn)生一份新的對象千劈,新對象計數(shù)器為1祭刚,源對象計數(shù)器不變
- 淺拷貝是指針拷貝,把地址給你,你和我指向同一個對象涡驮,源對象計數(shù)器加一暗甥,源對象和副本的計數(shù)器相同。
拷貝函數(shù)有copy和mutablecopy捉捅,調(diào)用copy時撤防,不管是NSString、NSDictionary棒口、NSArray菱肖、NSMutableString辽俗、NSMutableDictionary涤垫,或是NSMutableArray谤狡,都是copy出來是不可變的副本。
當(dāng)調(diào)用mutablecopy產(chǎn)生的都是可變的副本茎毁】税茫可變對象和不可變對象進行mutablecopy都是產(chǎn)生了一個新的對象,計數(shù)器為1七蜘,原來的對象計數(shù)器不變保檐。而如果是copy而且是不可變對象進行copy的話則是淺拷貝沒有產(chǎn)生一個新的對象相當(dāng)于retain操作了,因為OC設(shè)置copy語法本身就是為了改變副本而不去影響源對象崔梗,所以為了性能著想既然copy出來的都不可變了,自然也就不會產(chǎn)生一個新的對象了垒在。
可變對象進行copy就是深拷貝因為可變對象變成了不可變對象了蒜魄,結(jié)構(gòu)上發(fā)生了改變〕∏總結(jié)來說就是只有不可變對象調(diào)用copy為淺拷貝其他都是深拷貝谈为。
以上關(guān)于深拷貝和淺拷貝內(nèi)容參考MooAiFighting。
2踢关、assign
一般用來修飾基礎(chǔ)數(shù)據(jù)類型(NSInteger, CGFloat) 和 C數(shù)據(jù)類型(int ,float, double)等伞鲫。它的setter方法直接賦值,不進行任何retain操作签舞。
3秕脓、 retain
一般在MRC模式下使用,被retain修飾的對象儒搭,引用計數(shù)retainCount要加1的吠架。retain只能修飾oc對象,不能修飾非oc對象搂鲫。
需注意:容易出現(xiàn)循環(huán)引用傍药,導(dǎo)致內(nèi)存泄露問題。
4、 strong
strong表示對對象的強引用拐辽,一般在ARC模式下使用拣挪,相當(dāng)于retain
注意:兩個對象之間相互強引用造成循環(huán)引用,內(nèi)存泄漏俱诸。
5菠劝、 weak
weak表示對對象的弱引用,一般在ARC模式下使用乙埃,被weak修飾的對象隨時可被系統(tǒng)銷毀和回收闸英,用weak修飾弱引用,不會使傳入對象的引用計數(shù)加1介袜,weak比較常用的地方就是delegate屬性的設(shè)置甫何。
assign和weak的區(qū)別:當(dāng)它們指向的對象釋放以后,weak會被自動設(shè)置為nil遇伞,而assign不會辙喂,所以會導(dǎo)致野指針的出現(xiàn),可能會導(dǎo)致crash鸠珠。
strong和weak的區(qū)別:strong 表明是一個強引用巍耗,相當(dāng)于MRC下的retain,只要被strong引用的對象就不會被銷毀渐排,當(dāng)所有的強引用消除時炬太,對象的引用計數(shù)為0時,對象才會被銷毀驯耻。
weak 表明是一個弱引用亲族,相當(dāng)于MRC下的assign,不會使對象的引用計數(shù)+1可缚。
6霎迫、 readwrite和readonly
當(dāng)我們用readwrite修飾的時候表示該屬性可讀可改,用readonly修飾的時候表示這個屬性只可以讀取帘靡,不可以修改知给,一般常用在我們不希望外界改變只希望外界讀取這種情況。系統(tǒng)默認(rèn)的情況就是 readwrite描姚。
7涩赢、 nonatomic和atomic
nonatomic 非原子屬性。它的特點是多線程并發(fā)訪問性能高轩勘,但是訪問不安全谒主;與之相對的就是atomic,特點就是安全但是是以耗費系統(tǒng)資源為代價赃阀,所以一般在工程開發(fā)中用nonatomic的時候比較多霎肯。系統(tǒng)默認(rèn)的是atomic擎颖,為setter方法加鎖,而nonatomic 不為setter方法加鎖观游。