明智而审慎地使用NSCopying

如果父类没有实现NSCopying协议,那么子类必须复制它所继承的实例变量,除此之外,它还要复制子类自身声明的实例变量。

针对于继承父类实例变量这一部分应该采用alloc init方式来实现NSCopying的功能,因为与继承相关的实现细节都被封装在父类中了。
作者说这样一来可以用set方法来设置继承而来的实例变量的复制类型。
但是这里面说得太跳跃了,中间缺乏了过度的细节。
假设作者说的是对的,那么通过alloc init方式应该只是完成了指针的指向功能,这样子类就能指向父类的实例变量了,然后再通过子类的setter来设定是深复制还是浅复制,我只能这样理解了。

如果类继承了NSCopying,那么必须同时实现copyWithZone:。
copyWithZone方法会调用父类的实现来复制继承而来的实例变量,然后再复制类自身声明的实例变量。

如果父类使用了或者有可能使用了NSCopyObject,并且你还没有继承NSCopying,那你就不能使用alloc init来实现NSCopying行为,必须另想办法。
NSCopyObject只创建对象的浅复制,这意味着你通过NSCopyObject获取一个对象的时候,这个对象并没有被初始化,复制过来的指针仍然指向了与被赋值对象中包含的指针相同的内存,所以如果你对复制得到这个对象进行了某些操作,那么被复制的那个对象也会受到影响。为了避免这些,你需要首先对复制过来的对象初始化。

除此之外,复制得到的对象的引用计数也没有被初始化,你还要对其进行初始化。

你可能感兴趣的:(明智而审慎地使用NSCopying)