iOS:重新認(rèn)識(shí)Copy

在說(shuō)Copy之前,我們需要了解copy的目的的是什么?

Copy目的其實(shí)就是產(chǎn)生一個(gè)副本對(duì)象,副本對(duì)象跟源對(duì)象互相不影響
修改源對(duì)象,不會(huì)影響副本對(duì)象
修改副本對(duì)象,不會(huì)影響源對(duì)象

再看iOS給我們提供了兩個(gè)拷貝的方法:

1.copy:不可變拷貝,產(chǎn)生不可變副本
2.mutableCopy:可變拷貝,產(chǎn)生可變副本

再來(lái)認(rèn)識(shí)一下深拷貝淺拷貝

深拷貝:內(nèi)容拷貝,產(chǎn)生新的對(duì)象
淺拷貝:指針拷貝,沒(méi)有產(chǎn)生新的對(duì)象

我們舉個(gè)??:
我們使用NSString,NSMutableString來(lái)做一個(gè)對(duì)比


//  NSString
NSString *a = @"123";
NSString *aCopy = [a copy];
NSString *aMutableCopy = [a mutableCopy];        
NSLog(@"a --- %p, aCopy -- %p  aMCopy -- %p",a,aCopy,aMutableCopy);

-------------- log ----------------------
a --- 0x100001050, aCopy -- 0x100001050  aMCopy -- 0x102405630

/*
因?yàn)镹SString是不可變的,使用copy也只是變?yōu)椴豢勺兏北?,所以使用一塊內(nèi)存也互不干擾,所以NSString的copy是淺拷貝
當(dāng)NSString使用mutableCopy,拷貝出來(lái)的的可變副本對(duì)象要與源對(duì)象互不干擾的情況下,那么就得開(kāi)辟內(nèi)存,重新創(chuàng)建一個(gè)新對(duì)象,所以是深拷貝
*/



// NSMutableString
NSMutableString *a = [[NSMutableString alloc]initWithString:@"aaaaaaaaaaaaaaa"];
NSString *aCopy = [a copy];
NSString *aMutableCopy = [a mutableCopy];
NSLog(@"a --- %p, aCopy -- %p  aMCopy -- %p",a,aCopy,aMutableCopy);

-------------- log ----------------------
a --- 0x100512ba0, aCopy -- 0x100512c60  aMCopy -- 0x100512c90

/*
NSMutableString是可變字符串,當(dāng)拷貝出來(lái)的副本對(duì)象要與源對(duì)象互不干擾,所以NSMutableString得拷貝都是深拷貝
*/

copy mutableCopy
NSString 淺拷貝 深拷貝
NSMutableString 深拷貝 深拷貝
NSArray 淺拷貝 深拷貝
NSMutableArray 深拷貝 深拷貝
NSDictionary 淺拷貝 深拷貝
NSMutableDictionary 深拷貝 深拷貝

總結(jié):不可變類(lèi)型copy都是淺拷貝,不可變類(lèi)型mutableCopy都是深拷貝,可變類(lèi)型copy,mutableCopy都是深拷貝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容