深拷貝和淺拷貝解析

引言
最近項(xiàng)目中遇到一些有關(guān)自定義對(duì)象的copy問(wèn)題闺魏,今天在這里做一些記錄未状。以便加深理解和記憶。

什么是深拷貝析桥、淺拷貝司草?
  • 深拷貝:指針賦值,且重新開(kāi)辟內(nèi)存泡仗,內(nèi)容重新拷貝一份埋虹。
  • 淺拷貝:指針賦值,指針指向的內(nèi)容是同一個(gè)地址娩怎,內(nèi)容的引用計(jì)數(shù)+1搔课。
    注意在淺拷貝的時(shí)候如果指針指向的內(nèi)存區(qū)域被銷(xiāo)毀,指向這片內(nèi)存的指針都要重新定義不然會(huì)成為野指針截亦。
1.非集合對(duì)象的copy與mutableCopy

1.1 NSString

NSString *string1 = @"str1";
//copy返回的是不可變對(duì)象辣辫,str2不能被修改,因此會(huì)發(fā)生崩潰
NSString *string2 = [string1 copy];
NSLog(@"string1: %p %p,string2: %p %p",string1,&string1,string2,&string2);
    
NSMutableString *string3 = [string1 mutableCopy];
NSLog(@"string1: %p %p,string3: %p %p",string1,&string1,string3,&string3);

2017-08-03 20:26:26.450 TableViewTest[77698:6624676] string1: 0x10092e0f8 0x7fff5f2d5980,string2: 0x10092e0f8 0x7fff5f2d5978
2017-08-03 20:26:26.450 TableViewTest[77698:6624676] string1: 0x10092e0f8 0x7fff5f2d5980,string3: 0x608000077b00 0x7fff5f2d5970

從打印的內(nèi)容可以看的出來(lái)string1魁巩、string2內(nèi)容的地址相同,而string1姐浮、string2指針的地址不同谷遂。string1、string3內(nèi)容的地址和指針地址都不相同卖鲤∩鋈牛可知NSString的copy為淺拷貝畴嘶,mutablecopy為深拷貝

1.2 NSMutableString

NSMutableString *mstr1 = [NSMutableString stringWithString:@"test002"];
NSMutableString *mstr2 = [mstr1 copy];
NSLog(@"mstr1: %p %p,mstr2: %p %p",mstr1,&mstr1,mstr2,&mstr2);
//copy返回的是不可變對(duì)象,mstr2不能被修改集晚,因此會(huì)發(fā)生崩潰
//[mstr2 appendString:@"test"];
    
NSMutableString *mstr3 = [mstr1 mutableCopy];
//[mstr3 appendString:@"modify"];
NSLog(@"mstr1: %p %p,mstr3: %p %p",mstr1,&mstr1,mstr3,&mstr3);

2017-08-03 20:49:28.896 TableViewTest[78081:6667312] mstr1: 0x6000000767c0 0x7fff51c74980,mstr2: 0xa323030747365747 0x7fff51c74978
2017-08-03 20:49:28.896 TableViewTest[78081:6667312] mstr1: 0x6000000767c0 0x7fff51c74980,mstr3: 0x600000076800 0x7fff51c74970

從打印的內(nèi)容可以看的出來(lái)mstr1窗悯、mstr2、mstr3內(nèi)容地址和指針地址都不相同偷拔。所以NSMutableString的copy和mutableCopy都是深拷貝蒋院。且copy返回的對(duì)象是不可變對(duì)象

2. 集合對(duì)象

2.1 不可變對(duì)象NSArray

NSArray *arry1 = [[NSArray alloc] initWithObjects:@"value1", @"value2",nil];
NSArray *arry2 = [arry1 copy];
NSArray *arry3 = [arry1 mutableCopy];
    
NSLog(@"arry1: %p %p,arry2: %p %p",arry1,&arry1,arry2,&arry2);
NSLog(@"arry1: %p %p,arry3: %p %p",arry1,&arry1,arry3,&arry3);

2017-08-03 20:58:29.940 TableViewTest[78209:6684329] arry1: 0x608000223a00 0x7fff5f16f980,arry2: 0x608000223a00 0x7fff5f16f978
2017-08-03 20:58:29.940 TableViewTest[78209:6684329] arry1: 0x608000223a00 0x7fff5f16f980,arry3: 0x608000245280 0x7fff5f16f970

從打印的內(nèi)容可以看的出來(lái)arry1、arry2內(nèi)容的地址相同莲绰,而arry1欺旧、arry2指針的地址不同。arry1蛤签、arry3內(nèi)容的地址和指針地址都不相同辞友。可知NSString的copy為淺拷貝震肮,mutablecopy為深拷貝

2.2 可變對(duì)象NSMutableArray

NSMutableArray *arry1 = [[NSMutableArray alloc] initWithObjects:@"value1", @"value2",nil];
NSMutableArray *arry2 = [arry1 copy];
//copy返回的是不可變對(duì)象称龙,marry2不能被修改,因此會(huì)崩潰
//[arry2 addObject:@"value3"];
    
NSMutableArray *arry3 = [arry1 mutableCopy];
NSLog(@"arry1: %p %p,arry2: %p %p",arry1,&arry1,arry2,&arry2);
NSLog(@"arry1: %p %p,arry3: %p %p",arry1,&arry1,arry3,&arry3);

從打印的內(nèi)容可以看的出來(lái)arry1戳晌、arry2鲫尊、arry3內(nèi)容地址和指針地址都不相同。所以NSMutableString的copy和mutableCopy都是深拷貝躬厌。且copy返回的對(duì)象是不可變對(duì)象

自定義對(duì)象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末马昨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扛施,更是在濱河造成了極大的恐慌鸿捧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疙渣,死亡現(xiàn)場(chǎng)離奇詭異匙奴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)妄荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)泼菌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人啦租,你說(shuō)我怎么就攤上這事哗伯。” “怎么了篷角?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵焊刹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虐块,這世上最難降的妖魔是什么俩滥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮贺奠,結(jié)果婚禮上霜旧,老公的妹妹穿的比我還像新娘。我一直安慰自己儡率,他們只是感情好挂据,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著喉悴,像睡著了一般棱貌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箕肃,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天婚脱,我揣著相機(jī)與錄音,去河邊找鬼勺像。 笑死障贸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吟宦。 我是一名探鬼主播篮洁,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殃姓!你這毒婦竟也來(lái)了袁波?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜗侈,失蹤者是張志新(化名)和其女友劉穎篷牌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踏幻,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枷颊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了该面。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夭苗。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隔缀,靈堂內(nèi)的尸體忽然破棺而出题造,到底是詐尸還是另有隱情,我是刑警寧澤猾瘸,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布晌梨,位于F島的核電站桥嗤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仔蝌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一荒吏、第九天 我趴在偏房一處隱蔽的房頂上張望敛惊。 院中可真熱鬧,春花似錦绰更、人聲如沸瞧挤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)特恬。三九已至,卻和暖如春徐钠,著一層夾襖步出監(jiān)牢的瞬間癌刽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工尝丐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留显拜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓爹袁,卻偏偏與公主長(zhǎng)得像远荠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子失息,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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