因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但具体怎么做,它不关心。

当一个类要使用某一个Protocol(协议)时,都必须要遵守协议。比如有些必要实现的方法,你没有去实现,那么编译器就会报警告,来提醒你没有遵守××协议。注意,我这里说的是警告,而不是错误。对的,就算你不实现那些“必要实现”的方法,程序也是能运行的,只不过多了些警告。

Protocol(协议)的作用:

1. 定义一套公用的接口(Public)

  • @required:必须实现的方法

  • @optional:可选 实现的方法(可以全部都不实现)

2. 委托代理(Delegate)传值:

它本身是一个设计模式,它的意思是委托别人去做某事。

总结:协议是共同遵守的某种规则或规矩;代理是按照某种协议具体的实现者;

下面引用了博客园中作者求真求道的部分文章,感觉比较清晰:https://www.cnblogs.com/iyou/p/4939823.html

DaChu.h

/**
* 下面是声明协议的固定格式,DaChuDelegate是协议的名称,因为是代理协议,名称格式为:类名+Delegate
*/
@protocol DaChuDelegate <NSObject>
- (void)doSomethingAftercaiZuohaole;
@end @interface DaChu : NSObject
/**
* delegate 是dachu类的一个属性,weak 关键字是为了避免循环引用,<DaChuDelegate>表示遵守DaChuDelegate协议
* 更加直白点:在大厨心里有一个人接受他的菜好了的信号去做一些事情,具体这个人是谁,大厨不关心,这个人的代号是delegate
*/
@property (nonatomic, weak) id <DaChuDelegate> delegate;
- (void)kaiShiZuoCai;
@end
Dachu.m
#import "DaChu.h" @implementation DaChu
- (void)kaiShiZuoCai{
NSLog(@"开始做菜");
sleep();
NSLog(@"做好菜了,该上菜了"); //下面这句是判断 一下delegate是否实现了doSomethingAftercaiZuohaole方法,如果delegate没有实现
//直接[self.delegate doSomethingAftercaiZuohaole];会crash
if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
[self.delegate doSomethingAftercaiZuohaole];
} }
@end

下面看一看代理(实现者)这个类里面的内容:

#import "LaoWang.h"
#import "DaChu.h" /** <DaChuDelegate>表示遵守DaChuDelegate协议,并且实现协议里面的方法 */
@interface LaoWang ()<DaChuDelegate> @end @implementation LaoWang
- (void)laoWangKaiYe{
NSLog(@"老王开业了"); DaChu *dachu1 = [[DaChu alloc] init];
dachu1.delegate = self;//说明老王充当代理的角色,负责接收菜好了的信号。
[dachu1 kaiShiZuoCai];//大厨开始做菜
}
- (void)doSomethingAftercaiZuohaole{
NSLog(@"老王知道了");//这里可以通知服务员去上菜了
}
@end

总结:代理类似于现实生活中的代理公司,具体的工作代理公司帮你做;协议类似于你和代理公司签的合同。

最新文章

  1. VS2013无法启动&#160;IIS Express Web解决办法
  2. MongoDB数据库基本用法
  3. 20145225《Java程序设计》 实验五 Java网络编程及安全
  4. Lucene 4.X 倒排索引原理与实现: (2) 倒排表的格式设计
  5. Android 4.2蓝牙介绍
  6. PHP中header用法详解带范例(转)
  7. 判断是否是树(Is It A Tree?)
  8. PC结束 Spark 二次开发 收到自己主动,并允许好友请求
  9. 调皮的R文件,卑鄙的空格
  10. SCP测试服务器的上行/下行带宽
  11. android脚步---使用framelayout实现霓虹灯效果
  12. 不安装vc2015 Redistributable解决api-ms-win-crt-runtime-l1-1-0.dll丢失错误
  13. jjava Date格式是 May 07 17:44:06 CST 2018,怎么插入数据库中的timestamp格式中
  14. MongoDB与CouchDB 全方位对比
  15. _ZNote_Qt_重启软件
  16. go实现Windows服务注册
  17. 360sdk网游支付服务
  18. java 读取clob
  19. 精选10款超酷的HTML5/CSS3菜单
  20. Spring Cloud Eureka 5 (服务发现与消费-简单的robbin使用)

热门文章

  1. 并查集基础 模板题 hdu1232 畅通工程
  2. Oracle内置函数大全(转)
  3. RequestsLibrary库入门介绍
  4. STM in Clojure
  5. 打包python文件为exe文件(PyInstaller工具使用方法)
  6. Centos7.2 下安装配置pip
  7. 给Fitnesse添加调用多参数fixture的调用方法
  8. Vue拖拽组件列表实现动态页面配置
  9. HyperLedger Fabric 多机部署(一)
  10. 洛谷P2280 [HNOI2003]激光炸弹