總結一下關于屬性關鍵字的用法與區(qū)別

最近老有朋友問我一些關于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)允許不得轉載

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闽坡,一起剝皮案震驚了整個濱河市栽惶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疾嗅,老刑警劉巖外厂,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宪迟,居然都是意外死亡酣衷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門次泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穿仪,“玉大人席爽,你說我怎么就攤上這事“∑” “怎么了只锻?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長紫谷。 經(jīng)常有香客問我齐饮,道長,這世上最難降的妖魔是什么笤昨? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任祖驱,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己余境,他們只是感情好撇他,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布格嘁。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葛峻,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音巴比,去河邊找鬼术奖。 笑死,一個胖子當著我的面吹牛匿辩,可吹牛的內(nèi)容都是我干的腰耙。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼铲球,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晰赞?” 一聲冷哼從身側響起稼病,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掖鱼,沒想到半個月后然走,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡戏挡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年芍瑞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐墅。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拆檬,死狀恐怖洪己,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竟贯,我是刑警寧澤答捕,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站屑那,受9級特大地震影響拱镐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜持际,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一沃琅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜘欲,春花似錦阵难、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殿衰,卻和暖如春朱庆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闷祥。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工娱颊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凯砍。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓箱硕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悟衩。 傳聞我的和親對象是個殘疾皇子剧罩,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容