iOS - Copy 與 MutableCopy

參考鏈接


一、深拷貝和淺拷貝####

  • 深拷貝:對(duì)象拷貝 - 直接拷貝內(nèi)容。
  • 單層深拷貝:這種方式只能夠提供一層內(nèi)存拷貝(one-level-deep copy),并非真正的深拷貝。
  • 淺拷貝:指針拷貝 - 將指針中的地址值拷貝一份。

二、對(duì)于非集合對(duì)象 Copy 與 mutableCopy 的實(shí)踐#####
  • 思路:我用四個(gè)方案來(lái)驗(yàn)證 Copy 與 mutableCopy 的區(qū)別。
  • 方案:
    • 方案一:copy不可變的字符串
NSString*str = @"aaa";
NSString*copyStr = [str copy];
NSLog(@"str = %p copyStr= %p",str,copyStr);
NSLog(@"指針地址:str = %p copyStr= %p",&str,&copyStr);

輸出結(jié)果:str = 0x104d94068 copyStr= 0x104d94068
指針地址:str = 0x7fff529e9aa8 copyStr= 0x7fff529e9aa0
小結(jié):對(duì)不可變的字符串的copy,我們對(duì)象的內(nèi)存地址沒(méi)有改變,只是指針的地址改變了,所以在這里我們默認(rèn)進(jìn)行了一次淺拷貝,只拷貝了指針。

- 方案二:`copy可變的字符串`
NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"];
NSString*copyStr1 = [str1 copy];
NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1);
NSLog(@"str1 = %p copyStr1= %p",&str1,&copyStr1);

輸出結(jié)果:str1 = 0x7fa522712cd0 copyStr1 = 0x7fa522717ba0
指針地址:str1 = 0x7fff529e9a98 copyStr1= 0x7fff529e9a90
小結(jié):對(duì)可變字符串的copy,我們默認(rèn)進(jìn)行了一次深拷貝,直接拷貝了對(duì)象。
- 方案三:mutableCopy不可變字符串的

NSString*str2 = @"ccc";
NSMutableString *copyStr2 = [str2 mutableCopy];
NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);

輸出結(jié)果:str2 = 0x10d216108 copyStr2 = 0x7fa522726290
小結(jié):對(duì)于不可變字符串的mutableCopy我們默認(rèn)進(jìn)行了深拷貝。
- 方案四:mutableCopy可變字符串

NSMutableString*str3 = [NSMutableString stringWithFormat:@"ddd"];
NSMutableString*copyStr3 = [str3 mutableCopy];
NSLog(@"str3 = %p copyStr3 = %p",str3,copyStr3);

輸出結(jié)果:str3 = 0x7fa5227153c0 copyStr3 = 0x7fa5227263f0
小結(jié):對(duì)于可變字符串的mutableCopy我們默認(rèn)進(jìn)行了深拷貝。


三、對(duì)于集合對(duì)象采用 Copy 和 MutableCopy 的實(shí)踐

  • 對(duì)集合對(duì)象采用 Copy 和 mutableCopy 來(lái)進(jìn)行實(shí)踐
NSArray * arr = @[@"1",@"2",@"3"];
NSMutableArray * mutableArr = [arr mutableCopy];
NSArray * copyArr = [arr copy];
NSMutableArray * newArr = [NSMutableArray arrayWithObjects:@"3",@"2",@"1", nil];
NSArray * newCopyArr = [newArr copy];
NSMutableArray * newMutableCopyArr = [newArr mutableCopy];
//測(cè)試 arr 的 copy 和 mutableCopy
NSString * str = [arr firstObject];
NSString * copyStr = [copyArr firstObject];
NSString * mutableStr = [mutableArr firstObject];
//測(cè)試 mutableArr 的 copy 和 mutableCopy
NSString * str = [newArr firstObject];
NSString * newCopyStr = [newCopyArr firstObject];
NSString * newMutableCopyStr = [newMutableCopyArr firstObject];
圖3-1.png

圖 3-2.png

圖3-3.png
  • 通過(guò)圖 3-1 可以見(jiàn)到,對(duì)于不可變的 arr 如果進(jìn)行 copy 的話會(huì)進(jìn)行淺拷貝,如果 mutableCopy 會(huì)進(jìn)行內(nèi)容拷貝。但是,通過(guò)圖 3-2 打印出的地址信息,這里的內(nèi)容拷貝僅僅是拷貝 array 這個(gè)對(duì)象,array 集合內(nèi)的元素仍然是指針拷貝。所以可以定義為是單層深拷貝。
  • 通過(guò)圖 3-3 可以看出,對(duì)于可變的集合元素的 copy 與 mutableCopy 都是單層深復(fù)制。

四、結(jié)論####

  • 對(duì)于非集合對(duì)象
    • copy:因?yàn)閏opy默認(rèn)返回的是不可變的,所以當(dāng)我們對(duì)一個(gè)不可變的字符串進(jìn)行copy的時(shí)候,我們只是拷貝了它的指針(淺拷貝)。當(dāng)我們對(duì)一個(gè)可變的字符串進(jìn)行拷貝的時(shí)候,因?yàn)轭愋娃D(zhuǎn)變了,我們需對(duì)其進(jìn)行深拷貝
    • mutableCopy:默認(rèn)返回的是一個(gè)可變的對(duì)象,適用于可變的對(duì)象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。 無(wú)論對(duì)于可變的字符串還是不可變的字符串進(jìn)行mutableCopy,系統(tǒng)都默認(rèn)進(jìn)行深拷貝,那么為什么對(duì)于相同類型的進(jìn)行mutableCopy返回的仍然是新的對(duì)象呢,因?yàn)樵谶@里系統(tǒng)要保證,舊的對(duì)象和新的對(duì)象都是可變的,切他們之前不會(huì)相互影響。
  • 對(duì)于集合對(duì)象
    • 對(duì)于不可變的集合對(duì)象,copy 是淺拷貝,mutableCopy 是單層深拷貝。
    • 對(duì)于可變的集合對(duì)象,無(wú)論 copy 或者 mutableCopy 都是單層深拷貝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 177,128評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,291評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,025評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,421評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,642評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,970評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,157評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,410評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,821評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,053評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,896評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,157評(píng)論 2 375

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

  • 1、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制。顧名思義,淺復(fù)制,并不拷貝對(duì)象本身,僅僅是拷貝指向?qū)ο蟮闹羔槪簧顝?fù)制是直接...
    滴答大閱讀 780評(píng)論 0 2
  • 前言 不敢說(shuō)覆蓋OC中所有copy的知識(shí)點(diǎn),但最起碼是目前最全的最新的一篇關(guān)于 copy的技術(shù)文檔了。后續(xù)發(fā)現(xiàn)有新...
    zyydeveloper閱讀 3,383評(píng)論 4 35
  • 概念 在Objective-C中并不是所有的對(duì)象都支持Copy,MutableCopy,遵守NSCopying協(xié)議...
    LeoAu閱讀 8,832評(píng)論 10 28
  • 15號(hào)學(xué)習(xí)怎么組裝蛋糕 ps:蛋糕胚是韓國(guó)米糕 老板娘給我拍的美美的照片,連自己都認(rèn)不出來(lái)啦。???♂? 晚上和學(xué)妹...
    千雨小花閱讀 437評(píng)論 0 0
  • ack是tcp的一種確認(rèn)機(jī)制。tcp是一種可靠傳輸?shù)膮f(xié)議,怎么個(gè)可靠法則,就是不管你發(fā)送還是接收都要求對(duì)方確認(rèn),長(zhǎng)...
    郭青耀閱讀 168評(píng)論 0 0