复制的目的就是副本和源对象之间不会相互影响,浅拷贝不产生新对象,引用计数+1,深拷贝产生新对象。copy产生不可变对象,mutablecopy可变。
例如一个不可变的比如NSString,copy的话,它本身就不可变,就算和副本公用一个也不会互相影响,所以为了性能,copy后副本指向的就是源对象本身,只是引用计数+1了,这种情况和retain一样,叫浅复制,没有产生新对象。
概括的说,不可变对象copy,是唯一的浅复制。其他情况,都是深复制。比如可变对象mutablecopy,如果还指向同一个对象,那么修改其中一个另一个受影响。又或者不可变对象mutablecopy,不产生新对象,源对象不可变,如何实现mutablecopy复制出可变对象。
另外,数组字典这种容器类型,深复制是指容器本身是个新对象,但是里面装的元素,两个容器其实公用一份,复制的只是引用。比如可变数组里装着几个可变字符串,复制数组是深复制,确实产生了新数组,但是修改其中一个数组中的可变字符串,另一个也会变,因为它们指向同一个字符串。 |