编写高质量OC代码52建议总结:22.理解NSCopying协议
来源:互联网 发布:当程序员累不累 编辑:程序博客网 时间:2024/05/20 23:05
如果想令自己的类支持拷贝操纵,就要实现NSCopying协议
NSZone:以前开发程序时,会把内存分为不同的区,对象会创建在某个区里。现在不用,每个程序都会有一个默认区,这个参数不用管。。。
copy方法由NSObject实现,当我们想要覆写copy方法是,实际需要实现的是copyWithZone方法。
mutableCopy这个辅助方法与copy类似,也是用默认参数zone来调用mutableCopyWithZone。
在可变类中覆写copyWithZone时,不要返回可变的拷贝对象,应该返回一个不可变的版本。
对于NSArray和NSMutableArray来说,下面的关系总是成立的
[NSMutableArray copy] => NSArray
[NSArray mutableCopy] => NSMutableArray
注意:在可变对象上调用copy方法会返回一个不可变实例。这样做是为了能在可变版本与不可变版本之间自由切换。
Foundation 框架中所有集合类在默认情况下都执行浅拷贝,只拷贝容器对象本身,不复制其中数据。主要原因是,容器内的对象未必都能拷贝,而调用者也未必想在拷贝容器的时候一并拷贝其中的每个对象。
因为没有深拷贝的协议方法,其具体的实现方法由每个类来确定。在绝大多数情况下都是浅拷贝,深拷贝的方法只能自己来编写。
总结:
1.自定义对象想具备拷贝功能,需要实现NSCopying协议
2.自定义对象想分为可变与不可变两个版本,需要同时实现NSCopying和NSMutableCopying协议
3.复制对象时需要决定执行深拷贝还是浅拷贝,一般情况下尽量执行浅拷贝
4.如果对象需要执行深拷贝,可以考虑新增加一个执行深拷贝的方法
-(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.如果对象需要执行深拷贝,可以考虑新增加一个执行深拷贝的方法
0 0
- 编写高质量OC代码52建议总结:22.理解NSCopying协议
- 编写高质量OC代码52建议总结:1~8
- 编写高质量OC代码52建议总结:11.理解objc_msgSend的作用(消息机制)
- 编写高质量OC代码52建议总结:12.理解消息转发机制
- 编写高质量OC代码52建议总结:21.理解Objective-C的错误模型
- 编写高质量OC代码52建议总结:23.通过委托与数据源协议进行对象间通信
- 编写高质量OC代码52建议总结:10.关联对象
- 编写高质量OC代码52建议总结:9.以“族类模式“隐藏实现细节
- 编写高质量OC代码52建议总结:13.用“方法调配技术”调试“黑盒方法”
- 编写高质量OC代码52建议总结:16.提供“全能初始化方法”
- 编写高质量OC代码52建议总结:17.实现describtion方法
- 编写高质量OC代码52建议总结:18.尽量使用不可变对象
- 编写高质量OC代码52建议总结:19.使用清晰而协调的命名方式
- 编写高质量OC代码52建议总结:20.为私有方法加前缀
- 编写高质量OC代码52建议总结:26.不要在分类中设置属性
- 编写高质量OC代码52建议总结:27.使用“class-continuation 分类” 隐藏实现细节
- 写高质量OC代码52建议总结:28.通过协议提供匿名对象
- 写高质量OC代码52建议总结:37.理解“块”
- Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1(DFS好题)
- Objective-C实现常用的4种排序算法
- String类的常用方法总结
- 2.环境搭建-CentOS集群搭建
- sql server 数据库集
- 编写高质量OC代码52建议总结:22.理解NSCopying协议
- jquery ajax的get post
- 前端web开发命名规范 整理
- python异常和错误
- 华为S交换机堆叠配置大全
- 服务器获取客户端IP及客户端IP变化
- RAC 知识点整理
- Reverse Integer
- Java(TM) Platform SE binary 已停止工作