1. 前言:我们经常需要对对象进行拷贝,在OC语言中通过copy方法完成。 如果想令自己的类支持拷贝操作,那就要实现NSCopying协议。
- (id)copyWithZone:(NSZone *)zone {}
这里的NSZone 是什么?
解释:在以前的开发程序时,会据此把内存分成不同的“区”(zone),而对象会创建在某个区里面。
现在每个程序只有一个区:“默认区”(default zone)。所以尽管必须实现这个方法,但我们不用关心zone里面的参数了。
注意:有些类对象中的数据结构,可能没有在初始化方法中设置好,就是说类对象中含有数组,需要另行设置,例如:数组: [_arr mutableCopy]; 如果不进行这个操作,那么多个拷贝过去的类实例共享这一块内存。
2. mutableCopy这个辅助方法与copy类似,需实现NSMutableCopy协议。
- (id)mutableCopyWithZone:(NSZone *)zone
3. copy、immutableCopy、mutableCopy区别:
-[NSMutableArray copy] =>NSArray -[NSArray mutableCopy] =>NSMutableArray
copy:copy所拷贝的对象于当前对象类型一致;
immutableCopy:拷贝为不可变对象;
mutableCopy:拷贝为可变对象;
4. 深拷贝和浅拷贝
深拷贝:在拷贝的对象时,将其底层数据一并复制过去;
浅拷贝:只拷贝容器对象本身,而不复制其中数据;
注意:遵循协议不代表拷贝为深拷贝,还需自己编写方法来做,在绝大多数的情况下,执行的都是浅拷贝。