zoukankan      html  css  js  c++  java
  • 浅拷贝与深拷贝的理解

    浅拷贝与深拷贝

    首先我们要知道什么是浅拷贝和深拷贝

    浅拷贝:拷贝的值改变时原来的值跟着一起改变。

    深拷贝:拷贝的值可以无限层拷贝,拷贝值与原始值不发生任何影响


    我们先来看一个浅拷贝

    可以看到,我们拷贝的值发生改变时,原始值也在发生改变。

    那么什么是深拷贝呢
    这里我们利用json的属性即可完成深拷贝。
    注意:json只能拷贝object和array,不能拷贝function。

    拷贝值与原始值不发生任何影响

    到这里你可能会想,浅拷贝改变值相互影响,深拷贝不相互影响,很简单嘛。

    我们再来看一个例子

    你不是说浅拷贝是互相影响的嘛?为什么这里a.c和b.c不相同呢? `这里要注意,当object只有一层时是深拷贝`

    有人可能会想,浅拷贝中既然互相影响,那么他们指向的应该是同一个值吧。
    这里只说对了一半,我们都知道object是引用类型,引用类型存放在堆内存中,原始类型存放在栈内存中,这里很明显是引用类型。
    在堆内存中(引用类型),拷贝的值储存的是引用地址,而不是值。所以当引用地址的内容发生改变时,所有指向内存地址的变量都发生改变。

    这里我们进行打印一下,如果引用地址相同两个变量应相等。

    正好验证了,当object只有一层时是深拷贝,两个值不相等。 其他层拷贝则都是浅拷贝。

    所以,我们判断两个值是否是浅拷贝时,还可以通过两个变量是否相等来判断。

    总结

    1. 浅拷贝:拷贝的值改变时原来的值跟着一起改变,注意当object只有一层时是深拷贝。
    2. 深拷贝:拷贝的值可以无限层拷贝,拷贝值与原始值不发生任何影响。
    3. 使用JSON深拷贝时,只能进行拷贝对象或数组,不能拷贝函数,如果拷贝函数要使用递归的方式。
    4. 如果两个变量的指针相等,则是浅拷贝。
  • 相关阅读:
    求凸包 cogs896
    oc中的正则表达式基本语法(一)
    oc中数据库使用详细解释(二)
    oc中数据库使用详细解释(一)
    NSSearchPathForDirectoriesInDomains函数详解
    通讯录.数据来自字典
    类似新闻客户端.UIPageControl和UIScroll的结合使用,滑点控制图片页码.显示图片页码
    关于target...action中的一点体会
    一些比较给力的IOS学习网址推荐
    点击return收回键盘(不用inputview)
  • 原文地址:https://www.cnblogs.com/lovecode3000/p/12500911.html
Copyright © 2011-2022 走看看