iOS深拷貝(MutableCopy)與淺拷貝(Copy)的區(qū)別

深拷貝和淺拷貝的概念

iOS中有深拷貝和淺拷貝的概念十减,那么何為深拷貝何為淺拷貝呢塑顺?
淺拷貝:淺拷貝并不拷貝對象本身须误,只是對指向?qū)ο蟮闹羔樳M行拷貝
深拷貝:直接拷貝對象到內(nèi)存中一塊區(qū)域,然后把新對象的指針指向這塊內(nèi)存

在iOS中并不是所有對象都支持Copy和MutableCopy,遵循NSCopying協(xié)議的類可以發(fā)送Copy協(xié)議旭绒,遵循NSMutableCopying協(xié)議的類可以發(fā)送MutableCopy消息鸟妙。如果一個對象沒有遵循這兩個協(xié)議而發(fā)送Copy或者MutableCopy消息那么會發(fā)生異常。如果要遵循NSCopying協(xié)議挥吵,那么必須實現(xiàn)copyWithZone方法重父。如果要遵循NSMutableCopying協(xié)議那么必須實現(xiàn)mutableCopyWithZone方法。

可變對象和不可變對象分別調(diào)用Copy和MutableCopy方法的區(qū)別

1.系統(tǒng)非容器類對象

(1)調(diào)用copy和mutableCopy方法

   NSString *str = @"123";
   NSString *strCopy = [str copy];
   NSMutableString *mustr = [str copy];
   NSMutableString *muCopy = [str mutableCopy];
   [mustr appendString:@"4"];    //會直接崩潰
   [muCopy appendString:@"5"];
   NSLog(@"str = %@    strCopy = %@    mustr = %@    muCopy = %@",str,strCopy,mustr,muCopy);
   NSLog(@"str地址%p    strCopy地址%p    mustr地址%p     muCopy地址%p",str ,strCopy,mustr,muCopy);

輸出結果:

屏幕快照 2017-02-25 11.08.28.png
    NSMutableString *mustr = [NSMutableString stringWithFormat:@"123"];
    NSString *strCopy = [mustr copy];
    NSMutableString *mutableStr = [mustr copy];
    NSMutableString *mutableStrCopy = [mustr mutableCopy];
    [mutableStr appendString:@"5"];    //會崩潰
    [mutableStrCopy appendString:@"6"];
    NSLog(@"mustr = %@  strCopy = %@  mutableStr = %@   mutableStrCopy = %@",mustr,strCopy,mutableStr,mutableStrCopy);
    NSLog(@"mustr地址%p    strCopy地址%p    mutableStr地址%p     mutableStrCopy地址%p",mustr,strCopy,mutableStr,mutableStrCopy);

輸出結果:

屏幕快照 2017-02-25 14.28.28.png

從上面可以看出對系統(tǒng)非容器類不可變對象調(diào)用Copy方法其實只是把當前對象的指針指向了原對象的地址忽匈,而調(diào)用mutableCopy方法則是新分配了一塊內(nèi)存區(qū)域并把新對象的指針指向了這塊區(qū)域房午。對于可變對象來說調(diào)用Copy和MutableCopy方法都會重新分配一塊內(nèi)存。但是copy和mutableCopy的區(qū)別在于copy在復制對象的時候其實是返回了一個不可變對象丹允,因此當調(diào)用方法改變對象的時候會崩潰(個人猜測這一塊可能和OC的多態(tài)性有關)郭厌。

2.系統(tǒng)容器類對象

(1)調(diào)用copy和mutableCopy方法

    NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
    NSArray *arrayCopy = [array copy];
    NSMutableArray *muarray = [array copy];
    NSMutableArray *copyArray = [array mutableCopy];
    NSLog(@"array地址%p     arrayCopy地址%p      muarray地址%p     copyArray地址%p",array,arrayCopy,muarray,copyArray);

輸出結果:

屏幕快照 2017-02-25 15.14.31.png
    NSMutableArray *muarray = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
    NSArray *array = [muarray copy];
    NSArray *mutableCopy = [muarray mutableCopy];
    NSMutableArray *muCopy = [muarray copy];
    NSMutableArray *arrayCopy = [muarray mutableCopy];
    NSLog(@"muarray地址%p   array地址%p   mutableCopy地址%p   muCopy地址%p   arrayCpy地址%p",muarray,array,mutableCopy,muCopy,arrayCopy);

輸出結果:

屏幕快照 2017-02-25 15.38.51.png

從這上面看容器對象和非容器對象在分別調(diào)用Copy和MutableCopy時沒有什么分別,不可變對象調(diào)用Copy方法只是增加了對原對象的指針的引用雕蔽,調(diào)用MutableCopy方法是重新分配一塊內(nèi)存折柠,然后把新對象指向新內(nèi)存。而對于可變對象不管調(diào)用Copy還是MutableCopy都是新分配一塊內(nèi)存批狐。但是雖然重新分配了一塊內(nèi)存扇售,但是對象里面的數(shù)據(jù)依然是指針復制的,下面我們來看一段代碼:

    NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"1"],@"2",@"3", nil];
    NSArray *arrayCopy = [array copy];
    NSArray *arrayMutableCopy = [array mutableCopy];
    NSMutableArray *mutableArrayCopy = [array copy];
    NSMutableArray *mutableArrayMutableCopy = [array mutableCopy];
    NSLog(@"array地址%p     arrayCopy地址%p      arrayMutableCopy地址%p     mutableArrayCopy地址%p    mutableArrayCopy地址%p",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
    NSLog(@"array = %@   arrayCopy = %@    arrayMutableCopy = %@   mutableArrayCopy =  %@    mutableArrayCopy =  %@",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
    
    NSMutableString *mustr = array[0];
    [mustr appendString:@"2"];
    NSLog(@"array地址%p     arrayCopy地址%p      arrayMutableCopy地址%p     mutableArrayCopy地址%p    mutableArrayCopy地址%p",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
    NSLog(@"array = %@   arrayCopy = %@    arrayMutableCopy = %@   mutableArrayCopy =  %@    mutableArrayCopy =  %@",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);

輸出結果:
未更改數(shù)組里面內(nèi)容前的結果:

屏幕快照 2017-02-27 12.05.54.png

更改數(shù)組里面的內(nèi)容的輸出結果:

屏幕快照 2017-02-27 12.07.33.png

可以看到當更改原數(shù)組的值之后,所有新數(shù)組的值都更改了承冰,即使調(diào)用了MutableCopy方法創(chuàng)建的新數(shù)組里面的值也因此更改华弓,所以可以看出對于系統(tǒng)容器類對象,其元素對象始終是指針復制困乒。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寂屏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顶燕,更是在濱河造成了極大的恐慌凑保,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌攻,死亡現(xiàn)場離奇詭異,居然都是意外死亡频伤,警方通過查閱死者的電腦和手機恳谎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憋肖,“玉大人因痛,你說我怎么就攤上這事“陡” “怎么了鸵膏?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怎炊。 經(jīng)常有香客問我谭企,道長,這世上最難降的妖魔是什么评肆? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任债查,我火速辦了婚禮,結果婚禮上瓜挽,老公的妹妹穿的比我還像新娘盹廷。我一直安慰自己,他們只是感情好久橙,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布俄占。 她就那樣靜靜地躺著,像睡著了一般淆衷。 火紅的嫁衣襯著肌膚如雪缸榄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天吭敢,我揣著相機與錄音碰凶,去河邊找鬼。 笑死,一個胖子當著我的面吹牛欲低,可吹牛的內(nèi)容都是我干的辕宏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼砾莱,長吁一口氣:“原來是場噩夢啊……” “哼瑞筐!你這毒婦竟也來了?” 一聲冷哼從身側響起腊瑟,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聚假,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闰非,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘格,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年财松,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘪贱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡辆毡,死狀恐怖菜秦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舶掖,我是刑警寧澤球昨,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站眨攘,受9級特大地震影響主慰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜期犬,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一河哑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龟虎,春花似錦璃谨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棉安,卻和暖如春底扳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贡耽。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工衷模, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹊汛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓阱冶,卻偏偏與公主長得像刁憋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子木蹬,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

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