简介
- 浅复制:只改变新对象的指针指向,并未生成新的内存地址,只是将新对象的指针指向要复制对象的内存地址
- 深复制:改变新对象指针指向,还为对象生成新的内存地址。 深复制又分为单层深复制与完全深复制
1.单层深复制虽然生成了新的内存地址,但是新的对象中的元素地址还是旧对象元素的地址
2.完全深复制不仅内存地址是新的,对象里面的元素地址也是新的
代码探索
非集合类对象
copy操作:
NSString *str = @"123";
NSString *copyStr = [str copy];
NSLog(@"%p ---- %p", str, copyStr);
NSMutableString *mutableStr = [NSMutableString stringWithString:@"123"];
NSString *copyMutableStr = [mutableStr copy];
NSLog(@"%p ---- %p", mutableStr, copyMutableStr);
打印结果:
2019-10-27 00:45:57.085342+0800 iii[17764:606331] 0x1043560a8 ---- 0x1043560a8
2019-10-27 00:45:57.085455+0800 iii[17764:606331] 0x6000037de4c0 ---- 0xb44a90872ddcc8d4
可知:
- NSString类型的string进行copy操作生成的新对象只是指向了旧对象的内存地址,并未产生新的内存地址,即进行了浅复制
- NSMutableString类型的string进行copy操作产生了新的内存地址,生成NSString类型的对象,即进行了深复制
mutableCopy操作:
NSString *str = @"123";
NSString *copyStr = [str mutableCopy];
NSLog(@"%p ---- %p", str, copyStr);
NSMutableString *mutableStr = [NSMutableString stringWithString:@"123"];
NSString *copyMutableStr = [mutableStr mutableCopy];
NSLog(@"%p ---- %p", mutableStr, copyMutableStr);
打印结果:
2019-10-27 00:53:35.014694+0800 iii[17841:609737] 0x105a190a8 ---- 0x600003d97ab0
2019-10-27 00:53:35.014830+0800 iii[17841:609737] 0x600003d97ae0 ---- 0x600003d97b10
可知:
无论是NSString还是NSMutableString类型,进行mutableCopy操作都是深复制
集合类对象
copy操作:
NSArray *array = @[@"aaa", @"bbb"];
NSArray *copyArray = [array copy];
NSLog(@"%p ---- %p", array, copyArray);
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];
NSArray *copyMutableArray = [mutableArray copy];
NSLog(@"%p ---- %p", mutableArray, copyMutableArray);
打印结果:
2019-10-27 00:59:58.672244+0800 iii[17941:612750] 0x6000011f4960 ---- 0x6000011f4960
2019-10-27 00:59:58.672385+0800 iii[17941:612750] 0x600001f9bc90 ---- 0x6000011910c0
可知:
与非集合类对象结果相同:
- NSArray类型的string进行copy操作生成的新对象只是指向了旧对象的内存地址,并未产生新的内存地址,即进行了浅复制
- NSMutableArray类型的string进行copy操作产生了新的内存地址,生成NSString类型的对象,即进行了深复制
mutableCopy操作 :
NSArray *array = @[@"aaa", @"bbb"];
NSArray *copyArray = [array mutableCopy];
NSLog(@"%p ---- %p", array, copyArray);
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];
NSArray *copyMutableArray = [mutableArray mutableCopy];
NSLog(@"%p ---- %p", mutableArray, copyMutableArray);
打印结果:
2019-10-27 01:02:48.055444+0800 iii[17970:614232] 0x600000bbcda0 ---- 0x6000005c8840
2019-10-27 01:02:48.055563+0800 iii[17970:614232] 0x6000005c8450 ---- 0x6000005c8c00
与非集合类对象结果相同:
无论是NSArray还是NSMutableArray类型,进行mutableCopy操作都是深复制
单层深复制
打印数组中元素地址:
NSArray *array = @[@"111", @"222"];
NSArray *copyArray = [array mutableCopy];
NSLog(@"%p ---- %p", array[0], copyArray[0]);
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];
NSArray *copyMutableArray = [mutableArray mutableCopy];
NSLog(@"%p ---- %p", mutableArray[0], copyMutableArray[0]);
打印结果:
2019-10-27 01:08:17.634645+0800 iii[18027:616895] 0x103ddc0b8 ---- 0x103ddc0b8
2019-10-27 01:08:17.634780+0800 iii[18027:616895] 0x103ddc118 ---- 0x103ddc118
可知
元素的地址并没有发生变化,即为单层深复制
完全深复制
要实现元素地址的改变,即完全深复制,可使用协议或归档解档实现,写这篇文章时还没有了解到,现在补上博客:
完全深复制