集合数据类型的拷贝

浅拷贝 Shallow Copies

目前有许多方法来实现浅拷贝, 当你尝试一次浅拷贝时,集合中的对象会被 retain 一次, 并且新的集合会引用集合中对象的指针
示例 1

NSArray *shallowCopyArray = [someArray copyWithZone:nil];
NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];

深拷贝 Deep Copies

有两种方法对一个集合进行深拷贝, 可以使用 initWithArray:copyItems: 第二个参数为 YES, 集合中的每个对象都会执行一次 copyWithZone: 方法, 如果对象有适配 NSCopying 协议, 对象就会被深拷贝到新的集合中, 新的集合会是新生成对象的唯一持有者, 但是如果对象没有适配 NSCopying 协议, 就会产生 Runtime Error. 然而,
copyWithZone: 是一次浅拷贝, 这种类型的拷贝仅可有能产生一次 one-level-deep 拷贝, 可以类似 示例 2 那样显示的调用
示例 2

NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];

这项技术可以其他的集合类型也适用, 如果你需要一个真正的深拷贝的话, 例如你的 array 中的 item 也包含其他 array, 你就需要保证你内部所有的 item 都实现了 NSCoding 协议, 参考示例 3
示例 3

NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
          [NSKeyedArchiver archivedDataWithRootObject:oldArray]];

再来谈谈 copyWithZone:mutableCopyWithZone: zone 参数是可以为 NULL 的, 如果 zoneNULL 则会使用默认的 zone, 来之 NSDefaultMallocZone()

  • copyWithZone:,会返回一个新的对象 并且返回的对象会被触发者隐式的 retain , 触发者负责释放 一般来说返回的对象都是不可变的
  • mutableCopyWithZone: 会返回一个新的对象 并且返回的对象会被触发者隐式的 retain , 触发者负责释放, 一般来说返回的对象都是可变的

参考:apple 文档

猜你喜欢

转载自blog.csdn.net/u010435828/article/details/81511384