copy/mutablecopy
使用copy或者mutablecopy方法可以创建一个对象的副本
copy:需要实现NSCoppying协议
这些创建的是不可变副本(如:NSSting、NSArray、NSDictionary)
实现方法:copywithZone:
mutablecopy:需要实现NSMutablecopying协议
创建的是可变副本(如:NSMutableString、NSMutableArray、NSMutableDictionary)
实现方法:mutableCopyWithZone:
copy/mutableCopy原则:修改新(旧)对象,不影响旧(新)对象
例一:

打印结果:

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

打印结果:

分析:
内容不同,对象地址不同,修改新(旧)对象,不影响旧(新)对象
例三:

打印结果:

分析:
使用copy关键字,产生了一个新的不可变的对象
例四:

打印结果:

分析:
两个对象的内存地址完全一样,所以系统并没有创建一个新对象
总结:
当我们对一个不可变对象(NSString类型)使用copy时,系统是不会产生一个新对象,因为原来的对象是不能修改的,拷贝出来的对象也是不能修改的,那么既然两个都不可以修改,所以这两个对象永远也不会影响到另一个对象
深复制/浅复制
深复制: 直接拷贝整个对象内存到另一块内存中
内容拷贝,源对象和副本指向的是不同的两个对象,源对象引用计数不变,副本计数+1
浅复制:拷贝指向对象的指针,而不是对象本身
指针拷贝,源对象和副本指向的是同一个对象,对象的引用计数器+1

注意:
* 不可变对象:进行copy得到的是浅复制,进行mutableCopy得到的是深复制
* 可变对象:无论进行copy还是mutableCopy都是深复制
网友评论