OC中的copy :利用一个源对象产生一个副本对象
修改源的属性和行为,不会影响副本对象
修改副本对象的属性和行为,不会影响源对象
1.Copy的使用
一个对象可以调用copy或者mutableCopy 方法来创建一个副本对象
copy:创建的是不可变副本(NSString , NSArray, NSDictionary)
mutableCopy : 创建的是可变副本( NSMutableString , NSMutableArray, NSMutableDictionary)
使用copy功能前提是必须遵守NSCopying 协议 同时实现copywithzone方法,
同理使用mutableCopy 必须遵守NSmutableCopying 协议 和实现mutableCopywithzone方法
2.Copy的注意
--1.不可变对象 调用 Copy ----> 返回 不可变对象 (不会 产生一个新的对象)
因为原来的对象是不能修改的 copy返回的对象也是不可修改的,既然两个对象都不能修改,所以永远不能影响到另外一个对象,所以产生一个新的对象是没有意义的,(OC对内存进行优化,就不会产生一个新的对象)
--2.可变对象 调用 copy ----> 返回一个不可变对象 (ARC下会产生一个新对象,而MRC下不会产生新对象)
具体情况不一一列举
总结为
在MRC 下
--1.通过copy 产生的都是不可变对象 通过mutablecopy产生的都是可变对象
--2.copy 不会产生新的对象
在ARC 下
--1.通过copy 产生的都是不可变对象 通过mutablecopy产生的都是可变对象
--2.只有通过copy + 不可变对象 不会产生新的对象
3.深copy 和 浅copy
--1.若是没有生成一个新的对象,我们称之为浅copy,本质就是一个指针copy
--2.若是生成一个新的对象,我们称之为深copy,本质会创建一个新的对象
4.copy 在MRC下 内存管理
--1.浅copy 不会生成新的对象
但需要注意的是,浅copy会对以前的源对象进行一次retain 而新返回的对象引用计数和源对象相同
sososo 在释放时,需要对源对象进行一次release
--2.深copy 会产生新的对象,不会对源对象进行retain ,而新生成的对象,需要在释放时进行一次release