浅谈iOS开发的协议(protocol)和代理(delegate)
协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的。网上的很多博文只是讲了怎么使用,并没有说的很明白。下面我谈一下我的理解。
1.你要先搞明白,协议和代理为什么会出现,也就是说它存在的意义是什么,解决了什么问题。
协议和代理是模块化开发和封装的产物。
先讲一个小故事帮助大家理解:
老王有一家餐馆,刚刚开始的时候规模很小,所以老王一个人做了所有的事情:扫地,做菜,迎宾,上菜,收银。但是后面随着规模的扩大,老王一个人就吃不消了,忙死也忙不过来了。这时候怎么办?大家都很清楚吧,招人呗!所以后面就有了服务员,收银员,大厨,保洁员。
这就意味着原先老王的工作按模块进行了拆分。
餐馆的工作流程(业务逻辑)简单来说是这样的:点餐->做菜->上菜->收银->打扫卫生。
转换成编程世界的模型就是这样的:业务不是很复杂的时候,我们把所有的功能都写在一个类里面,这个类暂且叫老王,理论上所有的事情和功能都可以写到这个类里面。做菜方法,上菜方法,打扫方法......就造成了老王这个类非常的庞大和臃肿,并且容易出错。
那我们开始招人了,新建了大厨类,服务员类,收银类,保洁类,这四个类。大厨类有做菜方法,服务员类点菜,上菜方法,收银类有收银方法,保洁类有打扫方法。
仅仅这样还是不行的,因为模块开发必然就有模块分化以后模块之间的通信问题。大厨类只做菜 但是菜做好了怎么办,必须及时的上菜,让顾客享用。但是大厨自己不能上菜,所以大厨必须抛出菜做好了的信号,具体这个菜上不上,怎么上,就不是大厨关心的了。
2.协议和代理所发挥的作用
老王交代大厨,你只管做菜,菜做好了以后喊一声菜做好了(我见过一个餐馆是拉铃铛)。
那么老王跟大厨定的这个规矩就是协议(protocol),下面看代码:
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(2);
NSLog(@"做好菜了,该上菜了");
//下面这句是判断 一下delegate是否实现了doSomethingAftercaiZuohaole方法,如果delegate没有实现
//直接[self.delegate doSomethingAftercaiZuohaole];会crash
if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
[self.delegate doSomethingAftercaiZuohaole];
}
}
@end
下面看一看laowang这个类里面的内容
#import "LaoWang.h"
#import "DaChu.h"
@interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵守DaChuDelegate协议,并且实现协议里面的方法
@end
@implementation LaoWang
- (void)laoWangKaiYe{
NSLog(@"老王开业了");
DaChu *dachu1 = [[DaChu alloc] init];
dachu1.delegate = self;//说明老王充当代理的角色,负责接收菜好了的信号。
[dachu1 kaiShiZuoCai];//大厨开始做菜
}
- (void)doSomethingAftercaiZuohaole{
NSLog(@"老王知道了");//这里可以通知服务员去上菜了
}
@end
上面的这个过程,也可以看下图来理解:
关于协议的理解,大家还可以参考这篇博文。
http://www.cnblogs.com/iyou/p/3636848.html
如果你喜欢这篇文章,请关注我,您的支持十分重要!
浅谈iOS开发的协议(protocol)和代理(delegate)的更多相关文章
- Ios开发之协议protocol
Protocol是ios开发中的一个难点也是一个重点,要想使用好,或者理解好它,可能需要时间的累积.今天我们就通过一个例子来简单的看一下,怎么样使用protocol. 我们今天用的例子就是模拟电脑插入 ...
- 浅谈iOS开发中多语言的字符串排序
一.前言 在iOS开发中,一个经常的场景是利用tableview展示一组数据,以很多首歌曲为例子.为了便于查找,一般会把这些歌曲按照一定的顺序排列,还会加上索引条以便于快速定位. 由于歌曲名可能有数字 ...
- 【转】iOS 开发之协议protocal-代理传值delegate
原文网址:http://www.cnblogs.com/wzrong/p/3201938.html 刚开始做iOS开发的时候,对 protocol.delegate 的理解一直都是晕晕乎乎一知半解的状 ...
- 协议(Protocol) 和代理(Delegate)
1.概念与组成 delegate是iOS中一种常见的设计模式,是一种消息传递的的方式,常见的消息传递方式还有以下几种: 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. ...
- 浅谈iOS开发中方法延迟执行的几种方式
Method1. performSelector方法 Method2. NSTimer定时器 Method3. NSThread线程的sleep Method4. GCD 公用延迟执行方法 - (vo ...
- 浅谈iOS视频开发
浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...
- 浅谈iOS多线程
浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...
- 浅谈Excel开发:十一 针对64位Excel的插件的开发和部署
自Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集. 随着64位操作 ...
- 浅谈iOS中的userAgent
浅谈iOS中的userAgent User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...
随机推荐
- Devexpress之popupMenu
1.拖放一个BarManager控件barManager1和一个PopupMenu控件popupMenu1 2.设置popupMenu1的Manager属性为barManager1 3.拖放一个Tex ...
- Entity Framework快速入门笔记—增删改查
第一步:创建一个控制台应用程序,起名为EFDemo 2. 第二步:创建一个实体模型 (1)在EFDemo项目上面右击选择添加—新建项—在已安装的选项中选择数据—ADO.NET实体对象模型,如图所示: ...
- Interleaving String——Leetcode
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...
- Fiddler基本用法以及如何对手机抓包
一.Fiddler是什么? ·一种Web调试工具. ·可以记录所有客户端和服务器的http和https请求. ·允许监视.设置断点.修改输入输出数据. 官方文档(英文):http://docs.tel ...
- 如何让虚拟目录里面的webconfig不继承网站的设置
在一个网站 中国红木网 下 建一个虚拟目录,结果虚拟目录系统会调用 中国红木网 上的web.config, 在网上找到以下解决方案 在(如根目录)所在的Web.config加上 如:<locat ...
- linux 多线程基础1
一.什么是线程 在一个程序里的多个执行路线就叫做线程.更准确的定义是:线程是“一个进程内部的一个控制序列”. 典型的unix进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情. ...
- Linux趣谈
要解释操作系统是如何工作的,首先可以用这几个关键字来简单地概括一下:冯诺依曼.堆栈机制和中断机制. 提到冯诺依曼很显然就是在说存储程序了,这大概是计算机能够运行最为基础的条件,属于基石级别的.它的基本 ...
- js去除空格
function trim(str){ return str.replace(/(^\s*) | ( \s*$ )/g,"" ); }
- SAP HANA SLT 将Oracle表 数据同步到HANA数据库
简单介绍SLT 同步数据的整个配置过程: 在SLT系统中创建与Oracle的链接 在HANA监控平台上,创建Configuration 创建表的同步作业 ——————————————BEGIN———— ...
- 【转】android错误 aapt.exe已停止工作的解决方法
http://www.jb51.net/article/57420.htm 在使用eclipse进行安卓java的编程的时候,有时候我们会遇到这样的问题:那就是无故弹出aapt.exe停止工作的提示, ...