好久之前写的了,刚毕业时面试经常遇到的问题。
浅拷贝
指针拷贝,复制一个新的指针,指向同一块内存区域。实际内存并没有发生拷贝
深拷贝
内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区
一个有趣的现象
NSMutableString *string = [NSMutableString stringWithFormat:@"name"];
NSLog(@"原始string的地址:%p",string);
// 这里发生了深拷贝,内存地址不一样了
NSMutableString *copyString = [string copy];
NSLog(@"拷贝string的地址:%p",copyString);
// 这里的copyString 实际上是一个不可变字符串,没有 appendString 方法,所以调用时就崩溃了。
[copyString appendString:@"test"];
copy 关键字
copy 出来的字符串一定是不可变字符串,如果传入的是可变字符串,会发生深拷贝为不可变字符串,否则为浅拷贝。
mutablecopy 关键字
mutablecopy,一定是深拷贝,拷贝出来的一定是可变字符串或者数组,即使传入的是不可变字符串或者数组。
为什么 NSString 使用 copy 修饰?
使用 copy 修饰之后,即使属性拷贝来自可变字符串,也会被深拷贝成不可变字符串,也就是源字符串修改之后不会影响到属性字符串,增强了代码的健壮性。
为什么不可变字符串和数组的 copy 是浅拷贝
既然数据源本身是不可变的,也就是具备安全性,那么系统默认浅拷贝其中数据,显然是合理的做法。
文档信息
- 本文作者:Ning Zhang
- 本文链接:https://sunsetroads.github.io/2016/11/21/oc-copy/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)