OC当中的深拷贝和浅拷贝
来源:互联网 发布:进销存数据库设计 编辑:程序博客网 时间:2024/05/01 12:45
深拷贝和浅拷贝是一个经常问到的问题。
很多人认为copy是浅拷贝,mutableCopy是深拷贝。在解释copy与mutableCopy的区别,我们先搞清楚什么是深拷贝和浅拷贝
从图我们看出来浅拷贝只是拷贝了指针,而并未拷贝对象本身。而深拷贝则是指针和对象本身都进行了拷贝
代码演示
使用不可变集合对象
NSArray *array = @[@"4444"]; NSArray *array2 = array; NSLog(@"array === %p %p", &array, array); NSLog(@"array2 === %p %p", &array2, array2);
打印结果
array === 0x7fff5fbff738 0x100403120array2 === 0x7fff5fbff730 0x100403120
array与array2指针地址不同
mutableCopy
NSArray *array = @[@"4444"]; NSArray *array2 = [array mutableCopy]; NSLog(@"array === %p %p", &array, array); NSLog(@"array2 === %p %p", &array2, array2);
打印结果
array === 0x7fff5fbff738 0x100203520array2 === 0x7fff5fbff730 0x1002024e0
我们发现两者的指针指着不一样,内容也不一样,也就是说,实现了内容和指针的拷贝。也就是深拷贝
那是用copy时候的打印结果是什么?
打印结果
array === 0x7fff5fbff738 0x100202b90array2 === 0x7fff5fbff730 0x100202b90
结果是内容没有拷贝,而指针进行了拷贝。故copy为浅拷贝
结论
使用不可变对象时,无论是copy还是mutableCopy。结果都是浅拷贝
使用可变对象
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"111", @"222", nil]; NSMutableArray *array1 = [mutableArray copy]; NSLog(@"mutable ===== %p %p", &mutableArray, mutableArray); NSLog(@"array1 ===== %p %p", &array1, array1);
打印结果
mutable ===== 0x7fff5fbff758 0x100203cb0array1 ===== 0x7fff5fbff750 0x100203170
指针进行了拷贝,内容也进行了拷贝。所以是深拷贝。
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"1111",@"22222", nil]; NSMutableArray *array = [mutableArray mutableCopy]; NSLog(@"mutable ===== %p %p", &mutableArray, mutableArray); NSLog(@"array1 ===== %p %p", &array, array);
打印结果
mutable ===== 0x7fff5fbff758 0x100401270array1 ===== 0x7fff5fbff750 0x100403230
其指针和内容都已经进行了改变。所以这个时候mutableCopy便是深拷贝了。
结论
对于使用可变对象时,copy和mutableCopy都是深拷贝。
那深拷贝和浅拷贝在使用上的区别呢?
NSArray *mutableArray = @[@"111"]; NSMutableArray *array = [mutableArray copy]; [array addObject:@"333"]; NSLog(@"%@", array);
打印结果
-[__NSSingleObjectArrayI addObject:]
说明array是不可变数组,那如何改变array呢?
NSArray *mutableArray = @[@"111"]; NSMutableArray *array = [mutableArray mutableCopy]; [array addObject:@"333"]; NSLog(@"%@", array);
我们发现此时array是可以更改的对象
最终结论
对于不可变对象而言,copy便是浅拷贝,而mutableCopy是深拷贝。
对于可变对象而言,copy和mutableCopy都是深拷贝。但是copy出来的对象是不可变的,而mutableCopy则是可变对象。
0 0
- OC当中的深拷贝和浅拷贝
- oc的浅拷贝和深拷贝
- OC浅拷贝和深拷贝
- oc中的深拷贝和浅拷贝
- OC学习 -- 浅拷贝和深拷贝
- OC中浅拷贝和深拷贝
- OC中的浅拷贝和深拷贝
- OC 中的深拷贝和浅拷贝
- OC浅拷贝和深拷贝
- oc 深拷贝和浅拷贝
- OC 深拷贝、浅拷贝
- OC中的字符串属性(深拷贝和浅拷贝)
- 【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝
- OC中关于copy和mutableCopy的使用 及深拷贝、浅拷贝的概念
- JS当中的拷贝!!!
- c++中 拷贝构造函数的深拷贝和浅拷贝--“浅拷贝”与“深拷贝”
- OC 详解深拷贝与浅拷贝
- swift/OC 深拷贝 浅拷贝
- 创建和使用动态链接库
- test_1059_投篮比赛
- NDK Java 调用 C代码
- 【HDFS】hadoop2.x HDFS javaAPI
- Android 自定义加载框
- OC当中的深拷贝和浅拷贝
- 圈子金融的weex领悟 - weex-start
- Analysis of 【Dropout】
- java虚拟机
- 【mapreduce】hadoop2.x—mapreduce实战和总结
- Java高并发,如何解决,什么方式解决
- 使用swoole实现生产者消费者模型(2)
- poj1751
- Android ADB命令的使用