使用对象时经常需要拷贝它,如果想令自己的的类支持拷贝操作,那么就要实现NSCopying协议,该协议只有一个方法:
-(id)copyWithZone:(NSZone*)zone
为何会出现NSZone呢,以前开发程序时,会据此把内存分为不同的区,而对象会创建在某个区里面。现在不用了,每个程序只有一个区:默认区(default zone)。所以说,尽管必须实现这个方法,但不必担心zone参数。
当对象调用copy方法时候,其实是调用这个协议方法!重写NSCopying方法里面可以做一些其他操作。另外拷贝的话不管属性还是实例变量都有以拷贝过来,不能共用。通常在该方法里,我们会调用下全能初始化方法来生产一个新对象,但有时候如果初始化方法可能要设置一个复杂的内部数据结构,可是在拷贝后的对象中,这个数据结构立刻要用其他数据来复写,所以没必要在设置一遍。
对应的copy的协议还有一个NSMutableCopying协议。用于返回可变的对象。如果在可变对象上调用copy协议方法,返回的就是不可变对象。
NSCopying和NSMutableCopying协议可以同时实现
如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法
网友评论