iOS中的copy暮刃,mutableCopy,深拷貝和淺拷貝

點贊再看,養(yǎng)成習(xí)慣,
歡迎大家關(guān)注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷模板,歡迎Star妄均!

copy就是內(nèi)容copy壤巷,比如NSString寄症,copy就是新生成了一個對象您访;但是如果是NSArray,NSDictionary等,copy的是其對象的指針,并沒有copy里面的內(nèi)容,這種也叫做淺拷貝偏化。深拷貝是神馬呢?簡單镐侯,就是把里面的內(nèi)容也給拷貝了侦讨。

以下copy和mutableCopy僅僅指Objective-C中的copy和mutableCopy。上段話本人混淆了C++中的copy和OC中的copy苟翻。

mutableCopy就是拷貝一個mutable對象。(我也不知道我在說什么)

那么上面的理解全面嗎崇猫?讓我們從最簡單的字符串(非容器類)來做試驗吧:

前提:在iOS中并不是所有的對象都支持copy沈条,mutableCopy,遵守NSCopying 協(xié)議的類可以發(fā)送copy消息邓尤,遵守NSMutableCopying 協(xié)議的類才可以發(fā)送mutableCopy消息拍鲤。假如發(fā)送了一個沒有遵守上訴兩協(xié)議而發(fā)送 copy或者 mutableCopy,那么就會發(fā)生異常。但是默認的iOS類并沒有遵守這兩個協(xié)議汞扎。如果想自定義一下copy 那么就必須遵守NSCopying,并且實現(xiàn) copyWithZone: 方法季稳,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現(xiàn) mutableCopyWithZone: 方法。

image
image

自然是可以發(fā)送copy和mutableCopy消息的澈魄。

首先身為理工女我要做個數(shù)學(xué)題景鼠,NSMutableString NSString和 copy mutableCopy,在“=”左右有幾種組合呢,

image

代碼如下:

image
image

大家發(fā)現(xiàn)神馬了:test1和test2是一個地址铛漓,也就是說copy并沒有創(chuàng)建出來一個新字符串對象溯香;

                     1和3不同,說明mutableCopy創(chuàng)建出一個新字符串對象浓恶;

                     1和4相同玫坛,說明沒有生成新對象;

                     1和5不同包晰,說明生成了新對象湿镀;

綜上所述,在字符串是直接賦值的伐憾,是否生成新對象是和=右邊有關(guān)的勉痴,如果=右邊是mutableCopy才會生成新對象。

讓我們試試別的字符串生成方式树肃,比如:

image
image

好吧蒸矛,結(jié)果同上。

還有另外一種生成方式胸嘴,如下:

image
image

只要=右邊從創(chuàng)建到賦值雏掠,至少包含一個NSMutable便會重新生成一個對象(新增:就是帶有mutable就是深copy,所以后三個便是深copy)筛谚。如果對一不可變對象復(fù)制磁玉,copy是指針復(fù)制(淺拷貝)和mutableCopy就是對象復(fù)制(深拷貝)。但是copy返回的對象是不可變的驾讲。

**新增:
簡單說明就是
[inmutableObj copy] 淺copy
[inmutableObj mutableCopy]深copy
[mutableObj copy] 深copy
[mutableObj mutableCopy] 深copy
新對象地址有變,我們就認為是深copy席赂。
**


容器類的copy mutableCopy

容器類本身的copy mutableCopy和非容器類的一樣吮铭,需要研究的是容器內(nèi)對象的變化

新增:上面一句話的意思,增加詳細解釋颅停。

image
image

從上圖可知谓晌,

[inmutableObj copy]淺拷貝

[inmutableObj mutableCopy]深拷貝 但是從輸出地址可以看出,僅僅該對象地址有變化癞揉,內(nèi)部對象是沒有變化的纸肉。

image
image

[mutableObj copy]深拷貝
[mutableObj mutableCopy]深拷貝

綜上所述,和字符串的結(jié)論是一樣的喊熟,不過集合類的內(nèi)部元素如果想實現(xiàn)真正的深拷貝柏肪,需要依次進行深拷貝才行
新增結(jié)束


自定義對象的copy和mutableCopy

image

首先必須遵守NSCopying,NSMutableCopying協(xié)議芥牌,不然當(dāng)WFPerson對象執(zhí)行copy和mutableCopy時會崩潰烦味!

根據(jù)copy其實調(diào)用的函數(shù)是copyWithZone;mutableCopy調(diào)用的函數(shù)是mutableCopyWithZone壁拉。我們可以猜測WFPerson當(dāng)其對象執(zhí)行copy mutableCopy是生成新對象谬俄。柏靶。。為什么呢溃论?因為我們自己寫的就是創(chuàng)建一個新對象屎蜓,_

新增:在自定義對象中钥勋,如果想在copy時梆靖,還是原對象,return self笔诵;即可返吻。

image
image

自定義對象中,注意到頭文件中

image

name屬性是copy乎婿,那么這里的copy和函數(shù)的copy之間的關(guān)系呢测僵?

情況1,直接給name賦值

image
image

代碼說明我們這里的copy是重新生成了字符串谢翎,根據(jù)上面字符串的判斷捍靠,s本身就是可變字符串,其copy必是新生成了一個字符串對象森逮。

驗證name是strong榨婆,推測會變?yōu)樾娦〖t,經(jīng)驗證的確如此褒侧,我就不粘圖了良风。。

如果這里有人想自己實現(xiàn)setName函數(shù)呢闷供,

image

如果是這樣寫烟央,就變回strong,也就是小強小紅了歪脏,不信你試試疑俭。。

image

這樣就是copy了婿失。出來的還是小強钞艇。那mutableCopy呢?還是小強豪硅。

image
image

發(fā)現(xiàn)兩個數(shù)組中的person的年齡都變化了哩照,說明內(nèi)部數(shù)據(jù)依然指向相同的內(nèi)容。

image

答案是

不能舟误。葡秒。。

image

說明copy出來的是不可變對象,copyArray不能執(zhí)行removeObject眯牧。蹋岩。。

更新支持文章持續(xù)更新学少!
歡迎大家關(guān)注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷模板剪个,歡迎Star!

來源:http://www.reibang.com/p/a99f3da35560

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末版确,一起剝皮案震驚了整個濱河市扣囊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绒疗,老刑警劉巖侵歇,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吓蘑,居然都是意外死亡惕虑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門磨镶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溃蔫,“玉大人,你說我怎么就攤上這事琳猫∥芭眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵脐嫂,是天一觀的道長统刮。 經(jīng)常有香客問我,道長雹锣,這世上最難降的妖魔是什么网沾? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蕊爵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桦山。我一直安慰自己攒射,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般链沼。 火紅的嫁衣襯著肌膚如雪建钥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天谍咆,我揣著相機與錄音鸟款,去河邊找鬼蛔屹。 笑死矢沿,一個胖子當(dāng)著我的面吹牛滥搭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捣鲸,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瑟匆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栽惶?” 一聲冷哼從身側(cè)響起愁溜,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎外厂,沒想到半個月后冕象,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡汁蝶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年渐扮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穿仪。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡席爽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啊片,到底是詐尸還是另有隱情只锻,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布紫谷,位于F島的核電站齐饮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笤昨。R本人自食惡果不足惜祖驱,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞒窒。 院中可真熱鬧捺僻,春花似錦、人聲如沸崇裁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拔稳。三九已至葛峻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巴比,已是汗流浹背术奖。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工礁遵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人采记。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓佣耐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挺庞。 傳聞我的和親對象是個殘疾皇子晰赞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354