若想令自己缩写的对象具有拷贝功能, 则需要实现 NSCopying 协议,
如果自定义的对象分为可变版本与不可变版本, 那么就要同时实现 NSCopying 协议和 NSMutableCopying 协议
复制对象是需要决定采用浅拷贝还是深拷贝, 一般情况下采用浅拷贝,
如果你所写的对象需要深拷贝, 那么就考虑新增一个专门执行深拷贝的方法.\
// 协议与分类
OC 语言有意向特性叫做 ‘协议‘, 它与 Java 的 ‘接口‘类似, OC 不支持多重继承,因而我们吧某个类应该实现的一系列方法定义在协议中.协议最常见的是实现委托模式, 不过也有其他用法, 理解并善用协议可令代码边的易于维护, 因为协议这种方式能很好的描述接口.
‘分类‘也是 OC 的一项重要语言特性, 利用分类机制,我们无需继承子类即可直接为当前类添加方法.
// 通过委托与数据源协议进行帝乡键通信.
对象之间经常需要互相通信,而通信的模式,OC 开发者广泛使用一种名为 ‘委托模式‘的变成来实现对象间的通信,该模式的主旨是: 定义一套接口, 某个对象若想接受另一套对象的委托, 则需要遵从此接口,以便成为其‘委托对象‘,而这‘另一个对象‘则可以给其委托对象回传一些信息, 也可以在发生事件是通知委托对象.
// 此模式可将数据与业务逻辑解耦, 比方说, 用户界面里有一个显示一系列数据所用的视图, 那么,此试图只应包含显示数据所需逻辑代码, 而不应该决定要显示何种数据以及数据之间如何交互的问题, 视图对象的属性中, 可以包含负责数据与事件处理的对象, 这两种对象分别称为‘数据源‘ 与 ‘委托‘. // 委托协议名通常是在相关类名后面加上 Delagate 一词,整个类名采用驼峰命名法.以便使用此代码的人理解, // 有了这个协议之后, 类就可以用一个属性来存放委对象. // @property (nonatomic, weak) iddelagete 一定要注意,这个属性需要定义成 weak, 而非 strong, 因为两者之间必须是 ‘非拥有关系‘
// 委托协议中的方法一般都是可选的, 因为 扮演 ‘受委托者‘ 角色的这个对象未必关心其中所有的方法, 为了指明可选方法,委托协议经常使用 @optional 关键字来标注大部分或全部的方法.
// 如果要在委托对象上调用可选方法, 那么必须提前使用类型信息查询方法 判断这个委托对象能否响应相关选择子.
// if ([_delegate respondsToSelector:@selector(action:)]) {
// [_delegate action:sender];
// }
// 这段代码用 ‘respondsToSelector‘ 来判断委托对象是否实现了相关方法, 如果实现了, 就调用, 如果没有实现, 就不执行任何操作, 这样的话, delegate 对象就可以完全按照其需要来实现委托协议的方法, 不用担心因为哪个方法没有实现而导致程序出问题, 即使没有设置委托对象,程序也能正常运行. 因为给 nil 发消息将使得 if 语句的值成为 false.
// 总结:
// 委托模式为对象提供了 一套接口, 使其可由此将相关事件告知其他对象.
// 将委托对象应该支持的接口定义成协议, 在协议中把可能需要处理的时间定义成方法.
// 当某个对象需要从另外一个对象中获取数据时,可以使用委托模式. 这种情境下, 该模式 也可以叫做 ‘数据源协议‘.
// 若有必要. 可实现含有位段的结构体, 将委托对象是否能响应相关协议方法这一信息缓存至其中;