在說(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都是深拷貝