OC 深拷贝和浅拷贝的理解

最近又回忆了一下浅拷贝,深拷贝。之前理解的不够透彻,现在开始梳理一下。

OC语言中拷贝分为三类:浅拷贝,不完全深拷贝,完全深拷贝

浅拷贝:没有开辟新的指针地址,只是将新对象指向原来的指针,并没有进行真正的复制。如下图:

深拷贝:深拷贝分为不完全深拷贝,完全深拷贝

不完全深拷贝:开辟了新的指针地址,但是如果copy的对象是容器类(NSArray等),容器内的元素还是原来的元素(容器内的元素指针地址指向同一块内存)。不完全深拷贝拷贝的只是一个容器对象,只是外壳。容器内的对象只保存一份引用

可以看见,上面的数组内的元素地址是一样的,但是两个数组的指针地址并不一样

完全深拷贝:开辟了新的指针地址,而且如果拷贝的对象是容器类(NSArray等),容器内的元素同样也深拷贝了,开辟了新的内存空间,即容器内元素指针地址也改变了。完全深拷贝是连同容器和内容对象一起拷贝一份,完完全全的拷贝。使用系统方法:[NSAarray alloc]initWithArray:array1 copyItems: YES];进行完全深拷贝,但是只能拷贝里面的一层。

在上面的方法里,因为进行了深拷贝,所以,改变mutArray2[2]的元素的时候,是单独的改变,并不会影响mutArray3[2]的元素,看下面打印的结果

但是,我们如果改变深层次的元素呢,数组里面的数组元素呢。上面测试中,我分别打印了mutArray2[3][3] 和mutArray3[3][3] 的地址,发现两个是一样的,并未改变,(说明深拷贝没到这一层,只是不完全深拷贝),下面改变 mutArray2[3][3]里面的元素,那么mutArray3[3][3]里面的元素也会改变。

添加代码: mutArray2[3][3][3] = @“it will not copy”;看下图打印结果

里面的元素同时发生了改变,并且地址一样

拷贝的目的是产生两个互不影响的对象,所以:

1. 对于不可变的对象来说,由于对象本身不可以进行改变,即不能对它产生影响。所以不可变对象的copy都是浅拷贝

2.不可变对象的mutableCopy是深拷贝 (这里所指的深拷贝是不完全深拷贝)

3.可变对象的copy是深拷贝

4.可变对象的mutableCopy是深拷贝

以下是不完全深拷贝的理解

当我们修改copyArray的时候,并不会影响到Array,但是修改copyArray里的objc的时候,array里面的objc也会改变


以下是完全深拷贝的理解

完全深拷贝是连同容器和内容对象一起拷贝一份,完完全全的拷贝,我们不论是修改copyArray还是修改copyArray里面的objc都不会影响到array和array里面的objc

默认情况下的深拷贝都是不完全深拷贝,如果需要实现完全深拷贝,使用下面的方法:

对于容器对象,也完全遵守上面的情况,只不过发生深拷贝时对容器对象本身来说是深拷贝,因为产生了新对象,而对容器内的元素来说是浅拷贝。即:修改容器内的元素,无论是原来对象还是拷贝产生的新对象,两个容器内的元素都会发生改变,因为容器内存的是容器元素的内存地址。如果想让容器对象本身及容器内的元素都发生完全深拷贝,使用[NSAarray alloc]initWithArray:array1 copyItems: YES]; 才能真正的实现完全深拷贝。后面的item一定要设置为YES才是完全深拷贝(这句代码只能进行一次深拷贝,比如数组里多层嵌套数组,只会拷贝外面的那层,如果要多次进行深拷贝,需要用到归档和解档)

浅拷贝,深拷贝,完全拷贝的区别

浅拷贝,在浅拷贝操作时,对于被拷贝对象的每一层都是指针复制

深拷贝,在深拷贝操作时,对于被拷贝对象,至少有一层是深拷贝

完全拷贝,在完全拷贝操作时,对于被拷贝对象的每一层都是对象拷贝

以上是我从网上摘取深浅拷贝有关知识的整理,平时我一般用深浅copy很少,也就是需要对对象状态改变,进行比较的时候所用到过。。如果有不对的内容,请大家指出来。毕竟,交流使我们进步!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • 1、对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接...
    滴答大阅读 761评论 0 2
  • 这篇文章主要翻译apple的官方文档和其他类似博文的学习记录 Copying Collections 概念 拷贝的...
    devZhang阅读 3,024评论 3 23
  • 1、浅拷贝: 拷贝了指向对象的指针,并没有复制对象本身,两个指针指向同一片地址空间. 2、深拷贝:重新复制了一个新...
    一滴矿泉水阅读 465评论 0 1
  • 引子 浅拷贝:指针拷贝,引用拷贝,指向同一内存地址 深拷贝:内容拷贝,指向不同内存地址,但是内容相同 容器类拷贝的...
    小白进城阅读 1,581评论 1 9
  • 天刚蒙蒙亮 便起床为新一天而准备 该庆幸 又看到了新一天的太阳 早七点 踏上工作的路途 忙碌的一天 就这样迎着朝阳...
    一言一诺阅读 236评论 1 2