深复制与浅复制

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

一、概念

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

二、对象拷贝遵循规则

无论是集合类型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)

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS 集合的深复制与浅复制 概念 对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是...
    难却却阅读 325评论 0 1
  • 概念对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接...
    无尽思绪阅读 384评论 0 0
  • 本文摘自:https://www.zybuluo.com/MicroCai/note/50592 概念 对象拷贝有...
    Jimmy_阿达阅读 350评论 0 0
  • 概念 对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直...
    liudhkk阅读 246评论 0 1
  • 概念 对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直...
    张霸天阅读 261评论 0 0