iOS-copy/mutableCopy、深复制/浅复制

copy/mutablecopy


使用copy或者mutablecopy方法可以创建一个对象的副本

copy:需要实现NSCoppying协议

这些创建的是不可变副本(如:NSSting、NSArray、NSDictionary)

实现方法:copywithZone:

mutablecopy:需要实现NSMutablecopying协议

创建的是可变副本(如:NSMutableString、NSMutableArray、NSMutableDictionary)

实现方法:mutableCopyWithZone:

copy/mutableCopy原则:修改新(旧)对象,不影响旧(新)对象

例一:

iOS-copy/mutableCopy、深复制/浅复制_第1张图片

打印结果:

分析:

我们可以看到,两个对象的内容完全一样,但是地址的空间变了,说明开辟了一块新内存给副本

例二:

iOS-copy/mutableCopy、深复制/浅复制_第2张图片

打印结果:

分析:

内容不同,对象地址不同,修改新(旧)对象,不影响旧(新)对象

例三:

打印结果:

分析:

使用copy关键字,产生了一个新的不可变的对象

例四:

iOS-copy/mutableCopy、深复制/浅复制_第3张图片

打印结果:

分析:

两个对象的内存地址完全一样,所以系统并没有创建一个新对象

总结:

当我们对一个不可变对象(NSString类型)使用copy时,系统是不会产生一个新对象,因为原来的对象是不能修改的,拷贝出来的对象也是不能修改的,那么既然两个都不可以修改,所以这两个对象永远也不会影响到另一个对象


深复制/浅复制


深复制: 直接拷贝整个对象内存到另一块内存中

内容拷贝,源对象和副本指向的是不同的两个对象,源对象引用计数不变,副本计数+1

浅复制:拷贝指向对象的指针,而不是对象本身

指针拷贝,源对象和副本指向的是同一个对象,对象的引用计数器+1

iOS-copy/mutableCopy、深复制/浅复制_第4张图片
深复制与浅复制关系

注意:

* 不可变对象:进行copy得到的是浅复制,进行mutableCopy得到的是深复制

* 可变对象:无论进行copy还是mutableCopy都是深复制

你可能感兴趣的:(iOS-copy/mutableCopy、深复制/浅复制)