最近老有朋友問我一些關于OC中聲明屬性中關鍵字的細節(jié)使用溃论,第一為了梳理下自己的思路為了日后好查找,第二為了省事就寫一篇這個總結文章吧案铺。
聲明一個屬性的過程中蔬芥,一共分三類關鍵字:讀寫權限關鍵字,原子性關鍵字以及引用計數(shù)關鍵字
1.讀寫權限關鍵字:readonly控汉,readwirte笔诵,默認是readwirte,顧名思義就不過多解釋了
2.原子性關鍵字:atomic,nonatomic姑子,默認是atomic原子性乎婿。這里區(qū)分一下atomic與nonatomic的區(qū)別,atomic保證了原子內(nèi)部的線程安全街佑,其實本質上也就是給屬性的setter方法中加了一個線程鎖谢翎,要知道OC內(nèi)部實現(xiàn)時是用MRC實現(xiàn)的捍靠,所以自然在setter方法中也有retain與release方法的調用,使用atomic關鍵字的好處就是當多條線程訪問同一個屬性的時候森逮,只有一條線程能夠進行操作榨婆,這樣就避免了在多條線程操作屬性時,一條線程執(zhí)行到了release方法另一條線程又拿到相關對象造成的空指針報錯問題(這只是其中一個好處)褒侧,但壞處就是會耗性能良风,而且大多數(shù)情況下用不到,而且在一些比較復雜的情況下的時候闷供,atomic也并不能提現(xiàn)出比nonatomic更多的優(yōu)勢烟央,所以一般使用的是性能更高的nonatomic關鍵字
3.引用計數(shù)關鍵字:1.retain/strong 2.assgin/unsafe_unretained 3.weak 4.copy
對于這四個引用計數(shù)的關鍵字retain和unsafe_unretained都是MRC中用的,就不過多解釋了
1.先從strong開始寫起歪脏,strong就代表給對象賦值的時候賦予對象的是一個指針疑俭,會使給對象賦值的那個對象引用計數(shù)+1,不會開辟新的內(nèi)存空間婿失,一般用于實例變量钞艇。
2.assgin一般是一個修飾基本數(shù)據(jù)類型的關鍵字,當然也可以修飾對象移怯,使用assgin關鍵字不會增加其引用計數(shù)香璃,但是當指向的對象被釋放的時候这难,會產(chǎn)生一個懸浮指針舟误,仍然指向空地址,這樣就會造成內(nèi)存泄漏或者野指針之類常見的不必要的麻煩
3.weak和assgin關鍵字很相似姻乓,但是weak只能是一個修飾對象的關鍵字嵌溢,不能修飾基本數(shù)據(jù)類型,使用weak不會使對象的引用計數(shù)+1蹋岩,但weak修飾的對象在被釋放的時候不會產(chǎn)生一個懸垂指針赖草,只會將對象置為nil
其實這里就解釋了為什么一般破循環(huán)引用的環(huán)是用weak而不是用assgin了,也做了assgin和weak的區(qū)別了
4.copy關鍵字指的是拷貝剪个,但是具體是深拷貝還是淺拷貝要聯(lián)系上下文決定秧骑,稍后我詳細寫。一般情況下是將一個對象內(nèi)存中的內(nèi)容拷貝一份扣囊,重新開辟一塊新的空間進行賦值乎折,再將引用copy關鍵字的屬性指向這塊區(qū)域。使用copy關鍵字會新開辟一塊內(nèi)存區(qū)域侵歇,但不會使賦值的對象引用計數(shù)+1骂澄。
所以引用計數(shù)的4個關鍵字就解釋完了,下面來區(qū)分一下拷貝中使用的mutableCopy和copy的區(qū)別:
首先惕虑,需要使用這兩個方法必須在類中遵守NSCopying或者NSMutableCopying協(xié)議坟冲,不然會報錯磨镶。
然后對于不同的情況,拷貝的結果和拷貝的方式都有不同健提,詳細列舉一下:
首先對于可變對象來說:
使用mutableCopy產(chǎn)生的結果是一個可變對象琳猫,并且會使用深拷貝的拷貝方式進行拷貝,
使用copy產(chǎn)生的結果是一個不可變對象私痹,并且也會使用深拷貝的方式進行拷貝沸移。
對于不可變對象來說:
使用mutableCopy產(chǎn)生的結果也是一個可變的對象,并且也會采用深拷貝的方式進行拷貝侄榴,
使用copy的話產(chǎn)生的結果是一個不可變的對象雹锣,但是,拷貝方式就會采用淺拷貝來進行拷貝了癞蚕。
這四種情況就代表了各種情況下拷貝對象的拷貝方式與拷貝結果的不同蕊爵,大家可以梳理一下,其實不是很繞桦山,
我自己總結了一下就是攒射,使用mutableCopy拷貝出來的結果絕壁是可變的,而且是采用深拷貝的方式恒水,但是使用copy就分情況了会放,他拷貝出來的東西絕壁是不可變的,但是對于可變對象來說使用的就是深拷貝的方式钉凌,對于不可變的對象就會采用淺拷貝方式拷貝指針咧最,這樣總結就比較好記了。
所以使用copy的時候切記要小心御雕,心里要明記上面的情況矢沿,尤其開發(fā)中對于可變對象的拷貝一定要小心,不然就會產(chǎn)生crash等結果酸纲,比較蛋疼捣鲸。
本文由作者原創(chuàng),未經(jīng)允許不得轉載