copy和mutableCopy都是浅拷贝!!!------你被骗了很多年
来源:互联网 发布:短信验证码 java 编辑:程序博客网 时间:2024/05/03 20:00
所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!!
(ps:什么是容器?比如NSArray,NSMutableArray,NSDictionary,NSMutableDictionary)
很多人一直认为,copy 是浅拷贝,mutableCopy 是深拷贝。我以前也是这么认为的。甚至很多网上的教学视频,很多书籍,很多博客,都是这么说的。但是,这大错特错!
为了防止有人不信,我们先拿出决定性的证据,然后再说其他的。
There are two kinds of object copying: shallow copies and deep copies. The normal copy is a shallow copy that produces a new collection that shares ownership of the objects with the original. Deep copies create new objects from the originals and add those to the new collection.
以上三句出自于苹果官方文档 Collections.pdf。
看不懂?没关系。我大致翻译一下。
有两种类型的对象拷贝,浅拷贝和深拷贝。正常的拷贝,生成一个新的容器,但却是和原来的容器共用内部的元素,这叫做浅拷贝。深拷贝不仅生成新的容器,还生成了新的内部元素。
In the case of these objects, a shallow copy means that a new collection object is created, but the contents of the original collection are not duplicated—only the object references are copied to the new container.
A deep copy duplicates the compound object as well as the contents of all of its contained objects.
以上两句出自于苹果官方文档 CFMemoryMgmt.pdf。
这个翻译过来和上面的意思几乎一样。
OK,有官方文档为证。现在我们至少可以明确地、大声地说出来:浅拷贝复制容器,深拷贝复制容器及其内部元素。
这点毋庸置疑了吧?
如果你看到这里,那说明你对 “浅拷贝复制容器,深拷贝复制容器及其内部元素“ 这句话没有疑问了。
好,下面我们来验证本文的题目:所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!!。上代码:
- NSMutableArray *element = [NSMutableArray arrayWithObject:@1];
- NSMutableArray *array = [NSMutableArray arrayWithObject:element];
现在我们有一个可变数组,它的名字是 array。
它只有一个元素,叫做 element。
它的这个唯一的元素是一个可变数组。
请在往下看之前确保你理解了上面这三句话。
- NSMutableArray mutableCopyArray = [array mutableCopy];
现在,我们对 array 进行了 mutableCopy,生成了一个新的可变数组,名字叫做 mutableCopyArray。
- [mutableCopyArray[0] addObject:@2];
array 的第一个元素是一个数组对吧。
mutableCopyArray 的第一个元素也是一个数组对吧。
现在我改变了 mutableCopyArray 的元素,往这个元素里加了一个 2。
现在输出 array[0] 看看,结果是 1 和 2。
为什么我们修改了 mutableCopyArray 的元素,结果 array 的元素也跟着改变了呢?
因为二者的元素是共用的。
也就是说,mutableCopy 只复制了容器(此处也就是数组),但是没有复制容器内的元素。
结合官方文档,结论:mutableCopy 是浅拷贝。
不相信?事实摆在眼前,有什么不可相信的?就因为你看的那些视频?那些博客?他们说的就是对的,就不会错了吗?
此外,当你问别人什么是深拷贝什么是浅拷贝的时候,如果他拿 NSString 或者 NSMutableString 给你举例子,那么请你别信,因为他也是在扯淡。
copy 与 mutableCopy 不等同于浅拷贝与深拷贝。
拷贝是针对容器类型和自定义类的,字符串根本就不是容器,还谈什么深拷贝浅拷贝???
说了半天 copy 和 mutableCopy 都是浅拷贝,那到底怎么才是深拷贝?
可以用系统中的 initWithArray:copyItems: 方法,比如:
- NSArray *deepCopyArray = [[NSArray alloc] initWithArray:someArray copyItems:YES];
也可以用我们自定义的方法,比如:
- - (NSArray *)test_deepCopy {
- NSMutableArray *array = [NSMutableArray array];
- for (id element in self) {
- id copyElement = nil;
- if ([element respondsToSelector:@selector(test_deepCopy)]) {
- copyElement = [element test_deepCopy];
- }
- else if ([element respondsToSelector:@selector(copyWithZone:)]) {;
- copyElement = [element copy];
- }
- else {
- copyElement = element;
- }
- [array addObject:copyElement];
- }
- NSArray *result = [NSArray arrayWithArray:array];
- return result;
- }
- - (NSMutableArray *)test_mutableDeepCopy {
- NSMutableArray *array = [NSMutableArray array];
- for (id element in self) {
- id copyElement = nil;
- if ([element respondsToSelector:@selector(test_mutableDeepCopy)]) {
- copyElement = [element test_mutableDeepCopy];
- }
- else if ([element respondsToSelector:@selector(mutableCopyWithZone:)]) {
- copyElement = [element mutableCopy];
- }
- else if ([element respondsToSelector:@selector(copyWithZone:)]) {
- copyElement = [element copy];
- }
- else {
- copyElement = element;
- }
- [array addObject:copyElement];
- }
- return array;
- }
我们来总结一下:
所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!!
浅拷贝复制容器,深拷贝复制容器及其内部元素
copy 与 mutableCopy 不等同于浅拷贝与深拷贝。
拷贝是针对容器类型和自定义类的,字符串根本就不是容器,还谈什么深拷贝浅拷贝???
如果面试官问你什么是深拷贝什么是浅拷贝,请自信地回答他。
如果他不认同你说的,请自信地拿出官方文档给他看。
- copy和mutableCopy都是浅拷贝!!!------你被骗了很多年
- copy和mutableCopy都是浅拷贝!!!
- copy和mutableCopy的深、浅拷贝
- 深拷贝和浅拷贝和copy和mutableCopy总结
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- copy和mutableCopy到底是浅拷贝还是深拷贝?
- 浅拷贝和深拷贝 iOS 的copy 以及 mutablecopy
- 关于copy, mutableCopy, 浅拷贝,深拷贝
- Copy(浅拷贝)、MutableCopy(深拷贝)
- Copy mutableCopy 深拷贝、浅拷贝
- copy(浅拷贝) mutableCopy(深拷贝)
- 浅拷贝 深拷贝 copy mutableCopy
- template-模板完全特化
- 字节流与字符流的区别
- http和htts的区别
- 总结
- Maven的下载与使用以及环境变量配置
- copy和mutableCopy都是浅拷贝!!!------你被骗了很多年
- 这些年,学spring走过的坑坑洼洼
- 复合模式(Compound Pattern)之MVC模式
- TabLayout ViewPager Frangment之间的应用
- jump-game
- 『孔壹学院』以太坊(Ethereum)代币系统、智能合约开发实战课程
- 实在解决不了的问题
- dao-service-servlet-jsp构建简易web通讯录(三层开发)知识点1
- ios8对flex部分不兼容问题