iOS开发中的深复制与浅拷贝

iOS开发中的深复制与浅拷贝

概念

苹果官方图

如图,左边为浅复制,右边为深复制。

浅拷贝之后的内容与原始内容指针地址相同,深拷贝之后的内容指向原始内容相关对象的一份拷贝。(深拷贝会逐个元素发送Copy消息,用拷贝得到元素创建Set);

简言之:浅拷贝为指针拷贝,深拷贝为内容拷贝。

举个🌰

  • 浅复制(Shallow Copies)
1
2
3
NSArray *shallowCopyArray = [someArray copyWithZone:nil];

NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO]
  • 深复制 (Deep Copies)
  1. 单层深复制(one-level-deep copy)。
1
2
//使用`initWithArray:copyItems`用YES做为第二个可以实现单层深复制(one-level-deep copy)。
NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];

如果你用这种方法深复制,集合里的每个对象都会收到 copyWithZone: 消息。如果集合里的对象遵循 NSCopying 协议,那么对象
复制后生成新的集合。如果对象没有遵循 NSCopying 协议,而尝试用这种方法进行深复制,会在运行时出错。

然而,copyWithZone: 这种拷贝方式只能够提供一层内存拷贝(one-level-deep copy),而非真正的深复制。

  1. 真正的深复制(A true deep copy)
1
2
3
//归档后解档 实现真正的深复制。
NSArray的* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[的NSKeyedArchiver archivedDataWithRootObject:oldArray]];

复制和可变性

对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制

没有专门定义深拷贝的协议,所以如果需要深拷贝,需要编写一个专供深拷贝所用的方法。