iOS 深拷贝及浅拷贝的区别
一、浅拷贝及深拷贝
1、浅拷贝(指针copy)
1)相当于对指向对象的指针进行复制,产生一个新的指向对象的指针;
2)就有两个指针指向同一个对象;
3)这个对象销毁后,两个指针都应置空;
4)对象引用计数+1
2、深拷贝(内容copy)
深copy不仅会复制对象本身,而且会递归复制每个指针类型的实例变量,直到两个对象没有任何公共的部分。
1)相当于对对象进行复制,产生一个新的对象;
2)就有两个指针分别指向两个对象;
3)当其中一个对象改变或者销毁后,另一个对象不受影响;
4)源对象引用计数不变,副本计数器设置为1
二、copy及mutableCopy
NSObject类提供了copy和mutableCopy方法,通过这两个方法即可复制已有对象的副本。
NSString,NSMUtablestring等系统类默认遵守NSCoppying及NSMUtableCoppying协议。
只有不可变对象创建的不可变副本(copy)才是浅copy,其它都是深copy。
1、copy方法
1)只要调用copy方法,总是返回对象的不可修改的副本。即便该对象本身是可修改的
2)eg: 调用NSMUtableString的copy方法,将返回不可修改的字符串对象。
2、mutableCopy方法
1)只要调用mutableCopy方法,总是返回对象的可变副本。即便该对象本身是不可修改的。
2)eg: 调用NSString的mutableCopy方法,总是返回对象的可修改的字符串对象。
3、示例代码

4、系统对象总结
1、对于系统的非容器类对象(eg:NSString,NSMUtableString)
如果对[不可变]对象复制,copy是指针复制(浅拷贝), mutableCopy就是对象复制(深拷贝)。
如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。
2、对于系统的容器类对象(eg:NSArray ,NSDictionary)
对于容器类本身,上面讨论的结论也是适用的,只不过是容器对象中的元素是是浅copy。
5、自定义类调用copy与mutableCopy复制对象的副本



6、setter方法的copy选项
1)copy指示符就是指定当前程序调用setter方法复制时,实际上是将传入参数的副本赋值给程序的实例变量。(通过点语法赋值时,实际上调用的就是setter方法)