您的位置:首页 > 编程语言

编写高质量OC代码52建议总结:22.理解NSCopying协议

2017-02-24 11:52 495 查看
如果想令自己的类支持拷贝操纵,就要实现NSCopying协议
-(id)copyWithZone:(NSZone *)zone{
return nil;
}


 NSZone:以前开发程序时,会把内存分为不同的区,对象会创建在某个区里。现在不用,每个程序都会有一个默认区,这个参数不用管。。。

 

 copy方法由NSObject实现,当我们想要覆写copy方法是,实际需要实现的是copyWithZone方法。

 
-(id)mutableCopyWithZone:(NSZone *)zone{
return nil;
}

-(id)mutableCopy{
return nil;
}
 

 mutableCopy这个辅助方法与copy类似,也是用默认参数zone来调用mutableCopyWithZone。

 在可变类中覆写copyWithZone时,不要返回可变的拷贝对象,应该返回一个不可变的版本。

 对于NSArray和NSMutableArray来说,下面的关系总是成立的

 [NSMutableArray copy] => NSArray

 [NSArray mutableCopy] => NSMutableArray

 注意:在可变对象上调用copy方法会返回一个不可变实例。这样做是为了能在可变版本与不可变版本之间自由切换。

 

 Foundation 框架中所有集合类在默认情况下都执行浅拷贝,只拷贝容器对象本身,不复制其中数据。主要原因是,容器内的对象未必都能拷贝,而调用者也未必想在拷贝容器的时候一并拷贝其中的每个对象。

 因为没有深拷贝的协议方法,其具体的实现方法由每个类来确定。在绝大多数情况下都是浅拷贝,深拷贝的方法只能自己来编写。

 

 总结:

 1.自定义对象想具备拷贝功能,需要实现NSCopying协议

 2.自定义对象想分为可变与不可变两个版本,需要同时实现NSCopying和NSMutableCopying协议

 3.复制对象时需要决定执行深拷贝还是浅拷贝,一般情况下尽量执行浅拷贝

 4.如果对象需要执行深拷贝,可以考虑新增加一个执行深拷贝的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐