Objective-C Protocol&Delegate(协议和代理)

定义

协议是多个类共享的一个方法列表。协议中列出的方法没有对应的实现,计划由他人来实现。协议提供了一种方式,用指定的名称定义一组相关的方法。这些方法通常由文档说明,所以实现者知道知道它们将如何执行。

定义一个协议的方法很简单,只需要使用@protocol指令,后面跟上你给处的协议名称。然后,和处理@interface一样,声明一些方法。@end指令之前的所有方法声明都是协议的一部分。

如果选择使用Foundation框架,你将会发现一些已定义的协议。其中一个名为NSCopying,而且它声明了一个方法。下面是标准Foundation头文件NSOBject.h中定义NScopying协议的方式:NSObject.h:

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end

使用

如果你的类使用NSCopying协议,则必须实现copyWithZone:方法。通过在@interface行加一对尖括号(<……>)内列出协议名称,可以告知编译器你正在采用一个协议,如:

@interface AddressBook : NSObject <NSCopying>

其含义为,AddressBook是父类为NSObject的对象,并且它遵守NSCopying协议。因为系统已经知道以前为这个协议定义的方法(从头文件NSObject.h中获知),所以并不必在接口部分声明这些方法。但是要在实现部分定义它们。编译器期望在AddressBook的实现部分找到定义的copyWithZone:方法。

如果你定义了自己的协议,不必由自己去实现它。但是,这就告诉其他程序员,如果要采用这项协议,则必须实现这些方法。这些方法可以从父类继承。这样,如果一个类遵守NSCopying协议,那么它的子类也遵守NSCopying协议(不过者并不意味着对该子类而言,这些方法得到了正确的实现)。

注意事项

  • 协议不引用任何类!它是无类的(classless)。任何类都可以都可以遵守某个协议 ;
  • 分类也可以采用一项协议;
  • 协议也可以采用一项协议;
  • 和类名称一样,协议名必须是唯一的。

代理 Delegate

协议也是一种两个类之间的接口定义。定义了协议的类可以看做是将协议定义的方法代理给了实现它们的类。这样,类可以更为通用,因为具体的动作由代理来承担,来响应某些事件或者定义某些参数。Cocoa和iOS非常依赖这个概念。例如,当你在iPhone上建立一个表格时,会使用UITableView类。但是这个类不清楚表格的标题是什么,需要包含多少个区块有多少行,填充单元格的内容是什么。所以,代理定义了一个UITableViewDataSource协议。如果它需要信息,比如表格中的每个区块有多少行,它就会调用类中实现协议的相关方法。UITableView类还定义了协议UITableViewDelegate。协议中还定义了一些方法,如表格中某些行选中需要怎么样。UITableView类并不知道还要做哪些事情,所以将这个代理给其他类。

欢迎来我的个站逛逛: http://alexyu.me/

    原文作者:dreamCatcher
    原文地址: https://www.jianshu.com/p/4cc018a85ca4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞