美文网首页
深复制与浅复制

深复制与浅复制

作者: 攻克乃还_ | 来源:发表于2017-12-01 20:35 被阅读10次

小编致力于用精简的语言说明不精简的问题

一、概念

  • 浅复制:拷贝指向对象的指针
  • 深复制:拷贝对象到另一块内存中

二、对象拷贝遵循规则

无论是集合类型NSArray、NSDictionary、NSSet ...,还是非集合类型NSString, NSNumber ... 对象,调用copy、mutableCopy方法时:

  • copy永远返回不可变对象
  • mutableCopy永远返回可变对象
  • 对于不可变对象进行copy操作,是指针赋值
  • 对于对象(无论可变不可变)进行mutableCopy操作,都是内容赋值

注:下面代码是对的,只是改变了str对象的指针

NSString *str = @"string";
str = @"newString";

三、集合拷贝遵循规则

3.1.集合的浅复制
  • 进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合
  • 浅复制代码举例
NSArray *shallowCopyArray = [someArray copyWithZone:nil];
NSSet *shallowCopySet = [NSSet mutableCopyWithZone:nil];
NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];
3.2.集合的深复制

方法1:initWithArray:copyItems:

  • 集合里的每个对象都会收到 copyWithZone: 消息。如果对象遵循 了NSCopying 协议,就会被深复制到新的集合。如果没有,用这种方法进行深复制,在运行时就会出错。copyWithZone: 方法只能够提供一层拷贝,而非真正的深拷贝
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

方法2:归档之后解挡

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
3.3.集合的单层深复制 (one-level-deep copy)

在多层数组中,对第一层进行内容拷贝,其它层进行指针拷贝

参考资料:
深复制与浅复制解析

相关文章

  • 设计模式 - 原型模式

    注意深复制与浅赋值的问题 C#中如果需要实现深复制,必须实现 ICloneable 接口。

  • 深拷贝(复制)与浅拷贝(复制)

    对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两...

  • Java 浅拷贝和深拷贝 拷贝和复制

    Java 复制与拷贝 大纲 浅拷贝和深拷贝 浅拷贝就是复制对象的一个精确副本 ==对于基本数据类型就是复制值,对于...

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

  • 浅|深 复制

    浅复制 //只写main函数 //结果是 我们可以看到一旦pointArray1发生了改变pointArray2也...

  • 前端笔记(二) 对象的深浅拷贝,函数的防抖与节流,函数柯里化 ,

    对象的深浅拷贝 对象的深拷贝与浅拷贝的区别: 浅拷贝:仅仅复制对象的引用, 而不是对象本身。 深拷贝:把复制的对象...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • 浅拷贝与深拷贝

    一 、基本概念 1.1 深拷贝 与 浅拷贝 对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身...

  • 2018-01-06 关于javascript的深拷贝浅拷贝 思

    目录: 什么是复制? 一个简单的浅复制 一个深复制的例子 普遍的深浅复制的几种实现方法 深拷贝,浅拷贝什么是复制?...

  • python中复制,浅拷贝,深拷贝

    python中包含复制 浅拷贝与深拷贝 1.复制 复制没有拷贝子对象,未开辟新内存空间,也没有产生新object,...

网友评论

      本文标题:深复制与浅复制

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