深拷贝和浅拷贝是个经常被闻到的问题.
很多人认为copy 是浅拷贝, mutableCopy 是深拷贝. 实际并非如此!
浅拷贝指的是对指针的拷贝, 而深拷贝指的是对指针和对象都进行了拷贝!
1. 不可变非集合类对象 copy 与 mutableCopy
对 字符串的 copy 与 mutableCopy 打印结果结论: 对字符串 copy, 只拷贝了指针没有拷贝对象, 是浅拷贝; 对字符串 mutableCopy 既拷贝了指针也拷贝了对象, 是深拷贝.
2. 可变非集合对象 copy 与 mutableCopy
对可变字符串的 copy 与 mutableCopy 打印结果结论: 对可变字符串的 copy 和 mutableCopy, 同时拷贝了指针和对象, 是深拷贝.
3. 不可变集合对象 copy 与 mutableCopy
对数组 进行 copy 和 mutableCopy 打印结果结论: 对不可变数组进行 copy, 只拷贝了指针, 对集合内部元素只拷贝地址; 对不可变数组进行 mutableCopy, 同时拷贝了指针和对象, 对集合内部元素也同时拷贝了内存和指针, 是深拷贝,
4. 可变集合对象 copy 与 mutableCopy
对可变数组进行 copy 和 mutableCopy 打印结果结论: 对可变数组进行 copy和 mutableCopy 时, 同时拷贝了指针和对象, 是深拷贝; 对集合内部元素 copy 只是 copy了指针, 不拷贝对象, 对集合内部元素 mutableCopy 时, 同时拷贝指针和对象.
接下来对 copy 和 strong 两个关键词修饰的属性, 进行对比分析:
5. 对赋值对象是不可变字符串(NSString)进行 copy 和 mutableCopy
对 Strong 和 Copy 修饰字符串修改值 打印结果结论: 对赋值对象是不可变字符串, copy 和 Strong 修饰效果一样; 当赋值对象是可变字符串, copy 修饰的 ivar 不会改变, strong 修饰的 ivar 会随着改变;(可变字符串, 用 copy 修饰, 深拷贝)
6. 对赋值对象是不可变集合对象(NSArray)进行 copy 和 strong 修饰
对数组进行 copy 和 strong 修饰 打印结果结论: 当数组元素是字符串时, 结果跟我们预料的一样; 但是当数组元素是 Model 对象时, 结果有点出乎预料! 对集合对象进行 copy 和 mutableCopy, 即便是拷贝内容, 拷贝的也是集合对象本身, 对于集合内部的元素只是拷贝了指针, 不拷贝内容. 所以当数组里面的 model 对象属性发生改变时, 拷贝的数组里面的元素也会随着改变!
总结: mutableCopy 深拷贝, 对可变对象 copy 也是深拷贝;
plus: copy 出来的集合对象是不可变的! 如果向copy 出来的数组中添加元素会报一下错误
-[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x6040000150c0
有不完整的地方请补充
网友评论