1、浅拷贝: 拷贝了指向对象的指针,并没有复制对象本身,两个指针指向同一片地址空间.
2、深拷贝:重新复制了一个新的对象 ,创建了一个新的地址空间.
从上图可以看出,浅拷贝A指针 与 拷贝后的B指针指向了同一片空间。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝
通俗理解为:浅拷贝好比你的影子,你死了,影子也没了;深拷贝好比克隆人,你死了,它还在。
深拷贝和浅拷贝的本质是地址是否相同
在开发过程中,大体上会区分为对象和容器两个概念,对象的copy是浅拷贝,mutablecopy是深拷贝。
( 容器: 容器内元素对象的拷贝,无论是copy,还是mutablecopy都是浅拷贝 )
1. 非容器不可变对象:NSString
2. 非容器可变对象: NSMutableString
3. 容器类不可变对象: NSArray
4. 容器类可变对象: NSMutableArray
代码举例
非容器不可变对象
结论:
1. 对于非容器不可变对象的copy为浅拷贝,mutableCopy为深拷贝
2. 浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象
3. 深拷贝返回新的内存地址,返回对象为可变对象
非容器可变对象
结论:
1. 对于非容器可变对象的copy为深拷贝
2. mutableCopy为深拷贝
3. 并且copy和mutableCopy返回对象都为可变对象
不可变容器
NSMutableString *str1 = [NSMutableString stringWithFormat:@"不可变容器可变对象"];
NSArray *array = [NSArray arrayWithObjects:str1, @"不可变容器", nil];
NSArray *copyArray = [array copy];
NSArray *mutableCopyArray = [array mutableCopy];
NSLog(@"array_p: %p, class: %@", array, [array class]);
NSLog(@"copyArray_p: %p, class: %@", copyArray, [copyArray class]);
NSLog(@"mutableCopyArray_p: %p, class: %@", mutableCopyArray, [mutableCopyArray class]);
NSLog(@"======原对象=====");
NSLog(@"object_p: %p, class: %@", array[0], [array[0] class]);
NSLog(@"object_p: %p, class: %@", array[1], [array[1] class]);
NSLog(@"======copy对象=====");
NSLog(@"object_p: %p, class: %@", copyArray[0], [copyArray[0] class]);
NSLog(@"object_p: %p, class: %@", copyArray[1], [copyArray[1] class]);
NSLog(@"======mutableCopy对象=====");
NSLog(@"object_p: %p, class: %@", mutableCopyArray[0], [mutableCopyArray[0] class]);
NSLog(@"object_p: %p, class: %@", mutableCopyArray[1], [mutableCopyArray[1] class];
输出:
结论:
从上述输出中可以看出不可变容器mutableCopy确实返回一个新的容器,但容器内的元素仍然是浅拷贝
可变容器
NSMutableString *str1 = [NSMutableString stringWithFormat:@"可变容器可变对象"];
NSMutableArray *array = [NSMutableArray arrayWithObjects:str1, @"可变容器", nil];
NSMutableArray *copyArray = [array copy];
NSMutableArray *mutableCopyArray = [array mutableCopy];
NSLog(@"array_p: %p, class: %@", array, [array class]);
NSLog(@"copyArray_p: %p, class: %@", copyArray, [copyArray class]);
NSLog(@"mutableCopyArray_p: %p, class: %@", mutableCopyArray, [mutableCopyArray class]);
NSLog(@"======原对象=====");
NSLog(@"object_p: %p, class: %@", array[0], [array[0] class]);
NSLog(@"object_p: %p, class: %@", array[1], [array[1] class]);
NSLog(@"======copy对象=====");
NSLog(@"object_p: %p, class: %@", copyArray[0], [copyArray[0] class]);
NSLog(@"object_p: %p, class: %@", copyArray[1], [copyArray[1] class]);
NSLog(@"======mutableCopy对象=====");
NSLog(@"object_p: %p, class: %@", mutableCopyArray[0], [mutableCopyArray[0] class]);
NSLog(@"object_p: %p, class: %@", mutableCopyArray[1], [mutableCopyArray[1] class]);
输出:
结论:
从上述输出中可以看出可变容器mutableCopy和copy都返回一个新的容器,但容器内的元素仍然是浅拷贝
总结:
通过上述代码分析:
copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝
文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.
网友评论