一、什么是委托

刚接触iOS开发的朋友肯定对委托这个东西感觉到陌生和迷惑,特别是Java转过来的(博主中枪),那么今天我们就简单的谈谈委托这个东西,atany会尽量做到说的浅显易懂的~

首先让我们来看看委托的定义:委托(delegate),就是某个对象指定另一个对象处理某些特定任务的设计模式。通俗来说,就是“某个对象”把要做的事情委托给“另一个对象”去做,简单吧。

其中“某个对象”被称作委托者,“另一个对象”被称作是被委托者。

【注】:委托者与被委托者的叫法很多,例如(普通对象与委托对象,委托与代理等等)为了方便大家理解,下文统一使用“委托与代理”的叫法。

在委托与代理之间还有一个重要的概念——协议,协议是委托与代理之间的桥梁,把两者紧密联系在一起。

二、委托与代理

如下图,委托方通过某种方式把任务分派出去给代理方处理,而两者之间的联系便是协议。

在程序中:一般情况下

1.委托需要做的工作有:

1.1定义协议与方法

1.2声明委托变量

1.3设置代理

1.4通过委托变量调用委托方法

2.代理需要做的工作有:

2.1遵循协议

2.2实现委托方法

可能现在大家还不明白,我们设置如下场景,把每个工作都带入代码就清楚了

场景:Boss准备举行一场party,准备邀请Atany来参加party,但是Boss没空写email给Atany,于是他委托Henry与Mary来做这件事情。

1)   先看YGViewController.h(根控制器,程序第一个界面,类似于Boss)

[cpp] view plaincopy
  1. #import <UIKit/UIKit.h>
  2. @protocol InviteDelegate
  3. -(void)inviteToMyParty:(NSString *)personName;//1.1定义协议与方法
  4. @end
  5. @interface YGViewController : UIViewController
  6. @property (assign,nonatomic) id<InviteDelegate> delegate;//1.2声明委托变量
  7. - (IBAction)ClickByMary:(id)sender;//委托给Mary
  8. - (IBAction)ClickByHenry:(id)sender;//委托给Henry
  9. @end

在YGViewController.h中,委托执行了两件事情,分别是定义协议与声明委托。Boss并没有实现inviteToMyParty这个方法,他没有自己去邀请。

2)   再看YGViewController.m中ClickByMary与ClickByHenry点击事件

[cpp] view plaincopy
  1. - (IBAction)ClickByMary:(id)sender {
  2. Mary *mary = [[Mary alloc]init];
  3. self.delegate = mary;//1.3设置代理
  4. [self.delegate inviteToMyParty:@"atany"];//1.4通过委托变量调用委托方法
  5. }
  6. - (IBAction)ClickByHenry:(id)sender {
  7. Henry *henry = [[Henry alloc]init];
  8. self.delegate = henry;//1.3设置代理
  9. [self.delegate inviteToMyParty:@"atany"];//1.4通过委托变量调用委托方法
  10. }

两者大同小异,都是实例化对象,然后设置代理,最后调用方法。

BOSS可以选择不同的代理(Henry与Mary)来做这件事情(inviteToMyParty),而自己却不用做。

3)   以Henry为例子,我们看看Henry.h

[cpp] view plaincopy
  1. #import <UIKit/UIKit.h>
  2. #import "YGViewController.h"
  3. @interface Henry : UIViewController <InviteDelegate>//2.1遵循协议
  4. @end

Henry遵循协议,随时准备好接收Boss的召唤。

4)   Henry.m中我们实现了inviteToMyParty的具体方法,我们弹出一个对话框来显示邀请内容。

[cpp] view plaincopy
  1. -(void)inviteToMyParty:(NSString *)personName{
  2. NSString *hello = [NSString stringWithFormat:@"Hello,%@",personName];
  3. NSString *str = [NSString stringWithFormat:@"Hey Boy,this is Henry,Come to our party Please!!"];
  4. UIAlertView *alert = [[UIAlertView alloc]initWithTitle:hello message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
  5. [alert show];
  6. }

按照上面步骤便完成一个简单的协议+委托的程序。

效果图:

这样来理解委托,代理,协议三者的区别相关推荐

  1. 设计模式——策略模式,工厂模式,代理模式三者的区别

    工厂模式主要是返回的接口实现类的实例化对象,最后返回的结果是接口实现类中的方法,而策略模式是在实例化策略模式的时候已经创建好了,我们可以再策略模式中随意的拼接重写方法,而工厂模式是不管方法的拼接这些的 ...

  2. 【详细】【转】C#中理解委托和事件 事件的本质其实就是委托 RabbitMQ英汉互翼(一),RabbitMQ, RabbitMQ教程, RabbitMQ入门...

    [详细][转]C#中理解委托和事件 文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C ...

  3. 北风设计模式课程---深入理解[代理模式]原理与技术

    北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...

  4. 把委托说透(2):深入理解委托

    在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口.本文将重点剖析委托的实质. 委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastD ...

  5. IOS 委托和协议区别和联系 (-)

    2019独角兽企业重金招聘Python工程师标准>>> IOS 委托和协议区别和联系 (-) IOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现 ...

  6. C#委托的定义 以及使用方式详解,更简单的理解委托。

    委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得 ...

  7. 理解面向连接和无连接协议之间的区别

               理解面向连接和无连接协议之间的区别 网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议. 面向连接和无连接指 ...

  8. 深入理解TCP/IP协议-TCP建立与终止连接

    转载自  深入理解TCP/IP协议-TCP建立与终止连接 一.引言   TCP 是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.连接创建与终止的状态变化图如下: ...

  9. 彻底理解正向代理和反向代理

    转载自 彻底理解正向代理和反向代理 平时工作中我们会接触到各种代理,它到底是什么概念呢,又是什么工作原理,下面我们具体来分析一下. 1.概念 正向代理 这个很好理解,比如说你现在要访问一个外国的社交网 ...

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

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

最新文章

  1. 使用Nginx搭建前端静态服务器+文件服务器
  2. Coefficients: (1 not defined because of singularities)
  3. photo.php,EasyPhoto.php
  4. 修改otrs notification master邮件通知地址和名称
  5. 奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?
  6. 计算机与技术卓越信息技术,2018版计算机科学与技术专业(卓越工程师)培养目标与毕业要求...
  7. 【机器视觉学习笔记】最近邻插值实现图片任意角度旋转(C++)
  8. oracle如何检查是否rac,Oracle RAC 状态检查
  9. 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
  10. Java输出小明算对多少题目_2014年Java方向C组第十题
  11. java_web用户的自动登录模块的实现
  12. PCS7安装时提示please insert the following CD-ROM: SIMTIC PCS7 V?.? SP1 DVD 2/2
  13. android json 转map,json字符串转map
  14. yuv420转yuv422(yuyv)
  15. MTK刷机(ubuntu下)
  16. 如何在html中插入表情包,一款支持插入表情的编辑器实现代码(简单思路挺重要)...
  17. 今天不写技术文章,摘一篇好文,呵呵(95%中国民营企业家富不过三代 子女教育存失误)
  18. mysql 表名 下划线_我们可以在MySQL表名中加下划线吗?
  19. jQueryUI皮肤下载、jQgrid中更换皮肤
  20. SQL查询学生表中每课大于85分的同学名称

热门文章

  1. 数据分析师工资高达50万,正在进入每一个行业!
  2. 《Qt 实战一二三》
  3. win10计算机不分区,win10有必要分区吗
  4. Computer composition and design work04 ——fifth verson
  5. 用RePKG解包.pkg文件【Wallpaper Engine】
  6. LightOJ 1336. Sigma Function
  7. 逃离996的年轻人却难逃租房的“坑”
  8. 数据挖掘 文本分类(二)搜集中文语料库与ICTCLAS分词
  9. Java快排两种写法
  10. input 输入框中文,监听的input事件 屏蔽拼音状态