1. 深浅copy的本质区别:
- 深copy: 在拷贝对象自身的时候,将底层数据也进行了复制过去。
- 浅copy: 只拷贝容器本身,不拷贝其中的数据(只拷贝指针)
打印输出结果:
由此可见:
两个数组虽然数据一致,但是所指的内存地址不同,说明 mutableCopy 在copy的时候,进行了深copy,把array的底层数据也进行了一份copy;如果使用的浅copy,生成新的指针,指向同一个内存地址。
2.copy的几种具体使用情况
-
字符串和容器数据的copy:
可变的容器数据进行内容操作的时候,根据深浅copy,结果会不同
打印结果:
- 如果是自定义的类,一般需要遵从<NSCopying>协议,才能对其进行copy操作,一般是使用的浅copy
<NSCopying> 协议 一般通过- (id)copyWithZone:(NSZone *)zone 方法实现
- 如果是给指针重新赋值,则会改变其内存地址,指向新的数据所在内存
NSString * str = @"哈哈哈";
NSString * str2 = str; //这个操作和copy是一样的处理
NSLog(@"打印出对应的自身地址2%p 内容指针%p 内容=%@",&str2,str2,str2);
str2 = @"嘻嘻嘻嘻"; //同一个指针,指向不同的内容地址
NSLog(@"打印出对应的自身地址2%p 内容指针%p 内容=%@",&str2,str2,str2);
NSLog(@"打印出对应的自身地址2%p 内容指针%p 内容=%@",&str,str,str);
输出结果:
打印出对应的自身地址20x7ffee6d25960 内容指针0x108ed9078 内容=哈哈哈
打印出对应的自身地址20x7ffee6d25960 内容指针0x108ed90d8 内容=嘻嘻嘻嘻
打印出对应的自身地址20x7ffee6d25968 内容指针0x108ed9078 内容=哈哈哈