iOS上的协议类似于C#、Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法;

委托是一种设计模式,是一种设计思想。

但是在iOS上面委托经常依托协议来实现(但并不是必须的)。一个很好的例子就是老板和秘书:老板要经营企业需要对新员工培训、对公司管理、打电话、发薪水等工作,但是对应老板来说一些事情例如打电话、发薪水的工作可以通过秘书来做,老板自己只负责对员工培训、公司管理,别的事情委托给秘书来做。委托思想就是在这种类似情况下产生的。

再说一下为什么iOS上面的委托经常依赖协议来实现?就像老板需要一个会打电话、发薪水的秘书来减轻老板自己的工作,但是老板并不知道谁有这两项技能,那老板就会发一个招聘,招聘会这两项技能的人。但老板怎样知道应聘人员会这两项技能那,老板会通过你的学历和工作经验判断应聘人员是否会这两项技能;但是对于程序来说,在不知道这个类的内部情况下怎样知道这个类是不是可以委托,评判标准是啥?这个时候如果一个类实现一个有这两项技能的协议,则能很容易判断出这个类具有这两项技能。这个就是iOS上面为什么委托经常和协议一块用。

协议

#import <Foundation/Foundation.h>

//协议是从类抽出的一些方法,如何实现这个协议的类都需要实现这里面的方法
@protocol SecProtocol <NSObject> @required
//发工资
- (void)payoff;
//打电话
- (void)tel; @optional @end

Boss

#import <Foundation/Foundation.h>
#import "SecProtocol.h" //委托人
@interface Boss : NSObject @property (nonatomic, retain) id<SecProtocol> delegate; //管理
- (void)manage;
//教导新员工
- (void)teach;
//打电话
- (void)tel;
//发工资
- (void)payoff;
@end

  

#import "Boss.h"

@implementation Boss

@synthesize delegate;

- (id)init{
self = [super init];
if (self) { }
return self;
} - (void)manage{
NSLog(@"boss manage");
} - (void)teach{
NSLog(@"boss teach");
} - (void)payoff{
[self.delegate payoff];
} - (void)tel{
[self.delegate tel];
}
@end

Sec

#import <Foundation/Foundation.h>
#import "SecProtocol.h"
// 秘书类,实现协议, 委托对象
@interface Sec : NSObject<SecProtocol> @end

  

#import "Sec.h"

@implementation Sec

- (id)init{
self = [super init];
if (self) { }
return self;
} - (void)payoff{
NSLog(@"sec payoff!");
} - (void)tel{
NSLog(@"sec tel");
}
@end

调用方法

Boss *boss = [[Boss alloc] init];//委托人
Sec *sec = [[Sec alloc] init];//委托对象,实现了一定协议的对象
boss.delegate = sec;//将委托对象复制给委托人里面的委托对象 [boss teach];
[boss manage]; [boss tel];
[boss payoff];

转自:http://my.oschina.net/simple2012/blog/151035

iOS 委托和协议区别和联系的更多相关文章

  1. 详解Objective-C中委托和协议

    Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...

  2. IOS跟ANDROID的区别

    大家总是会纠结哪个手机系统会更加适合自己,那就由小编我简要介绍一下IOS和安卓的区别吧! 运行机制:安卓是虚拟机运行机制,IOS是沙盒运行机制.这里再说明一下这两者的主要不同之处.安卓系统中应用程序的 ...

  3. CoAP、MQTT、RESTful协议区别

    /********************************************************************** * CoAP.MQTT.RESTful协议区别 * 说明 ...

  4. ​Web(click and script) 与 Web(HTTP/HTML)协议区别

    Web(click and script) 与 Web(HTTP/HTML)协议区别 webjavascriptvbscript浏览器脚本login 先从最简单的说明上来看, Web(HTTP/HTM ...

  5. IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

    最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...

  6. app测试中,ios和android的区别

    App测试中ios和Android的区别: 1. Android长按home键呼出应用列表和切换应用,然后右滑则终止应用: 2. 多分辨率测试,Android端20多种,ios较少: 3. 手机操作系 ...

  7. TCP协议与HTTP协议区别

    一.TCP协议与HTTP协议区别 1.直观认识 TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页 ...

  8. iOS delegate, 代理/委托与协议.

    之前知知道iOS协议怎么写, 以为真的跟特么java接口一样, 后来发现完全不是. 首先, 说说应用场景, 就是当你要用一个程序类, 或者说逻辑类, 去控制一个storyboard里面的label, ...

  9. IOS开发之----协议与委托(Protocol and Delegate) 实例解析

    1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 在写示例之前我给大家说下@required和@optional这两个关键 ...

随机推荐

  1. UI5_UINavigation传值

    // // AppDelegate.m // UI5_UINavigation传值 // // Created by zhangxueming on 15/7/7. // Copyright (c) ...

  2. 开放-封闭原则(OCP)

    对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码. 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为. Ope ...

  3. 20140912-关于.NET技术体系的思维导图

    逛园子时看到的. 关于.NET技术体系的思维导图

  4. windows内存映射学习及帮助类实现

    本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...

  5. ECMAScript整理笔记(持续更新....)

    参考文献: ECMAScript Array:http://www.jimmycuadra.com/posts/ecmascript-5-array-methods ECMAScript5兼容展示大全 ...

  6. 例题6-5 Boxes in a line uVa12657

    这道题目的解决方案是双向链表,数据结构本身并不复杂,但对于四种情况的处理不够细致,主要体现在以下几点: 分类讨论不全面,没有考虑特殊情况(本身不需要操作,需要互换的两元素相邻) 没有考虑状态4改变后对 ...

  7. Unity3d 动态批处理的问题

    这段时间做unity3d的优化,主要的入手是减少draw call.    1.代码上主要是把一些零碎的同材质的合并成一个大的mesh.    2.减少不必要的全屏后期处理.把摄像机的renderin ...

  8. jQuery select的操作代码

    jQuery對select的操作的实际应用代码. //改變時的事件  复制代码代码如下: $("#testSelect").change(function(){ //事件發生  j ...

  9. JS预览图像将本地图片显示到浏览器上的代码

    js代码实现: 从file域获取本地图片url并将本地图片显示到浏览器上. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...

  10. GridView中的荧光棒效果

    使用 ASP.NET中的GridView控件的时候会遇到这个效果,当时觉得很神奇,其实就是两句代码的事儿,可是时间长了,有点儿忘了,今天练习一下, 顺便把删除的时候弹出js中的confirm对话框也写 ...