-
(void)testCopy
{
NSArray * array = @[@"1",@"2",@"3"];
NSArray * arr2 = [array copy];
NSMutableArray * mul = [array mutableCopy];
NSString * oriFirst = [array firstObject];
NSString * mulFirst = [mul firstObject];
NSLog(@"%@\n%@",array.firstObject,mul.firstObject);/**
Printing description of array:
<__NSArrayI 0x618000241c80>(
1,
2,
3
)
Printing description of arr2:
<__NSArrayI 0x618000241c80>(
1,
2,
3
)
Printing description of mul:
<__NSArrayM 0x618000242ca0>(
1,
2,
3
)
可以見(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)的元素仍然是指針拷貝。所以可以定義為是單層深拷貝。
*/
NSMutableArray * newMul = [NSMutableArray array];
[newMul addObject:@"new1"];
[newMul addObject:@"new2"];
NSArray * copyMul = [newMul copy];
NSMutableArray * copyMul2 = [newMul mutableCopy];
NSString * oriFirst_ = [newMul firstObject];
NSString * mulFirst_ = [copyMul2 firstObject];
/**
(__NSCFConstantString *) $1 = 0x000000010f1daf10 @"1"
Printing description of newMul:
<__NSArrayM 0x60000004bee0>(
new1,
new2
)
Printing description of copyMul:
<__NSArrayI 0x60000003ec00>(
new1,
new2
)
Printing description of copyMul2:
<__NSArrayM 0x60000004fab0>(
new1,
new2
)
對(duì)于可變的集合元素的 copy 與 mutableCopy 都是單層深復(fù)制。
*/
NSLog(@"hello");
/**
對(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 都是單層深拷貝。
*/
}