明智而审慎地使用NSCopying

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容