浅拷贝 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
的, 如果 zone
为 NULL
则会使用默认的 zone
, 来之 NSDefaultMallocZone()
copyWithZone:
,会返回一个新的对象 并且返回的对象会被触发者隐式的retain
, 触发者负责释放 一般来说返回的对象都是不可变的mutableCopyWithZone:
会返回一个新的对象 并且返回的对象会被触发者隐式的retain
, 触发者负责释放, 一般来说返回的对象都是可变的
参考:apple 文档