深复制与浅复制

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

一、概念

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

二、对象拷贝遵循规则

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

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

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

你可能感兴趣的:(深复制与浅复制)