美文网首页
深拷贝和浅拷贝

深拷贝和浅拷贝

作者: 风依旧_c080 | 来源:发表于2021-09-06 15:36 被阅读0次

    深拷贝 : 拷贝出来的对象与源对象地址不一致! 这意味着我修改拷贝对象的值对源对象的值没有任何影响.
    浅拷贝 : 拷贝出来的对象与源对象地址一致! 这意味着我修改拷贝对象的值会直接影响到源对象.

    这里需要纠正网上一些错误的观点(以下为错误观点)
    copy都是浅拷贝, mutableCopy都是深拷贝

    我们知道, 当我们用copy从一个可变对象拷贝出一个不可变对象时, 这种情况就属于深拷贝而不是浅拷贝!!####

    注意 ! 深拷贝与浅拷贝也有相对之分!!!看下面

    对于NSString对象, 确实深拷贝就是深拷贝, 浅拷贝就是浅拷贝, 没有任何异议.
    但是对于NSArray, NSDictionary, NSSet这些容器类的对象呢? 当然浅拷贝依然是指针拷贝, 那深拷贝意味着连同容器及其容器内的对象一并拷贝吗? 还是只拷贝容器对象, 对容器内的对象则只是简单引用呢? 这里有两种情况, 我姑且把它称为不完全深拷贝与完全深拷贝。

    copy相对于直接赋值的好处

    看看以下代码 :

    image

    大家猜猜控制台输出是啥? 是( Kobe ), ( Kobe, McGrady )吗?
    错了错了!!!

    array = (
        Kobe,
        McGragy
    ), mArray = (
        Kobe,
        McGragy
    )
    
    

    为什么??? 明明可变数组添加对象是在赋值之后, 为什么后面添加对象还会影响到不可变数组呢??
    原因很简单, 因为Objective-C支持多态.
    所以表面上self.array是NSArray对象, 其实骨子里是NSMutableArray对象.这样的话将会对后期DEBUG增加很大的成本, 可能会导致莫名其妙的错误.
    再看以下代码 :

    image

    大家再来猜一下输出会是什么?
    没错!

    array = (
        Kobe
    ), mArray = (
        Kobe,
        McGragy
    )
    
    

    总结

    这里做出了一张图, 帮助新手弄清楚copy与mutableCopy的区别, 大神请无视_

    image

    转自链接:https://www.jianshu.com/p/5254f1277dba

    相关文章

      网友评论

          本文标题:深拷贝和浅拷贝

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