美文网首页
iOS - Tips - 深拷贝与浅拷贝

iOS - Tips - 深拷贝与浅拷贝

作者: reboot_q | 来源:发表于2018-01-22 16:17 被阅读5次

    深拷贝和浅拷贝是个经常被闻到的问题.

    很多人认为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

    有不完整的地方请补充

    相关文章

      网友评论

          本文标题:iOS - Tips - 深拷贝与浅拷贝

          本文链接:https://www.haomeiwen.com/subject/ejalaxtx.html