代理是Object-C中的一个重要机制,他可以将面向对象编程的封装特性进一步加强,不是自己负责的事情坚决不做,而是转而让对应的事情负责人(代理)去做。相反如果是自己需要负责的事情(作为别人的代理),会抢着去做。代理的引入真正意义上完全实现MVC的程序结构框架。

协议是对类的实现进行规约的一套标准,可以保证多个承诺实现协议的类的接口一致性。比如协议中定义了一个接口X,那承诺执行这个协议的类,就需要实现这个接口X.协议的关键性是让大家都有法可依有据可查。Object-C中很多时候,协议和代理是一起出现一起使用的,我们可以通过协议和代理来进行类与类之间的通信和交流。

抽象的描述,如果类A是类B的代理,那么类B定义出一套他的代理需要实现的接口,这套东西以协议的方式提供给A,类A实现了协议的接口,也就可以收到类B要告知他的内容。

以下是复制别人的,看着不粗

今天看到一个哥们总结delegate和protocol关系用了这样的一个比喻,觉得很贴切,拿来给大家分享一下:

把自己不想干的一些事情(洗衣做饭)找个助手来帮助你做,而你要的这个助手得有一定的能力,不是任何一个人都可以的,所以你就得有个招聘要求。好了,协议(protocol)就类似于你的招聘要求,你找到的助手就是代理(delegate)。  这样就有了  我.delegate = 助手;好了,这样以后再有洗衣做饭的活直接找助手做就可以了。

协议不是类,以@protocol关键字声明, 协议有两个对象:代理者和委托者。

代理者:实现协议的某个方法。

委托者:用自己的方法制定要实现协议的方法的对象。

协议的两个预编译指令@optional(/ˈɔpʃənl/):可以选择的方法。@required:必须执行的方法。

写个小例子:

协议:HelloworldDelegte.h

@protocol HelloworldDelegate <NSObject>

-(NSString *)getString;

@end

委托类:

ViewController.h

#import "HelloworldDelegte.h"

@interface ViewController:UIViewController

@property(nonatimic)id<HelloWorldDelegate>delegate;

@end

ViewController.m

-(void)viewDidLoad{

SecondViewController *second = [[SecondViewController alloc]init];

self.delegate = second;//指定代理对象second

NSString *str = [self.delegate getString];//获得代理方法的返回值。

}

代理类:

SecondViewController.h

#import "SetStringDelegate.h"

@interface SecondViewController:UITableBarController<SetStringDelegate>

@end

SecondViewController.h

-(NSString *)setString{

return @"helloWorld";

}

简单的代理回调也可以把代理对象设置为自身,可以在自身中实现协议方法。

@protocol HelloWorldDelegte <NSObject>

-(NSString *)setString;

@end

@protocol HelloWorldDelegate

@property(nonatomic,assign)id<HelloWorldDelegate>delegate;

-(NSString *)setString;

@end

@end

object-c 协议(Protocols)和代理(Delegation)的学习的更多相关文章

  1. 协议(Protocol) 和代理(Delegate)

    1.概念与组成 delegate是iOS中一种常见的设计模式,是一种消息传递的的方式,常见的消息传递方式还有以下几种: 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. ...

  2. [SuProxy]Ngnix+Lua 实现SSH2,LDAP,ORACLE,SQLSERVER等TCP/IP协议分析,劫持,代理,会话及负载

    目录 目录 目录 前言 介绍 安装 下载并拷贝 使用LuaRocks安装 运行测试 使用简介 处理器(processor)创建 通道(channel)创建 负载均衡 会话信息和会话管理 Event H ...

  3. Welcome-to-Swift-21协议(Protocols)

    协议定义了一个方法的蓝图,属性和其他适合特定任务或功能的要求.协议实际上并不提供一个这些要求的实现,它只是描述了一个实现会是什么样子.协议可以通过一个类,结构或枚举提供这些要求的具体实现.满足要求的任 ...

  4. HTTP权威协议笔记-6.代理

    6.1 Web的中间实体 Http的代理服务器即是客户端的服务器又是服务器的客户端. 它介于服务器与客户端之间,当客户端发送请求报文经过它时,它会像服务器一样正确的处理请求和返回响应,同时,代理服务器 ...

  5. 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  6. HTTP协议5之代理--转

    代理服务器 Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色. HTTP的代理服务器即是Web服务器又是Web客户端. Fiddler就是 ...

  7. http协议与http代理

    TCP/IP协议族 TCP/IP(Transmission Control Protocol/InternetProtocol.传输控制协议/网际协议)是用于计算机通信的一个协议族. TCP/IP协议 ...

  8. Object.defineProperties()与Proxy对象代理

    Object.defineProperties() 了不起啊..vue.js通过它实现双向绑定的 Object.defineProperties(obj,props) 方法直接在一个对象上定义新的属性 ...

  9. HTTP协议复习二--代理

    代理(Proxy)是HTTP协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客 户端的请求,也可以转发服务器的应答.代理有很多的种类,常见的有:1.匿名代理:完全“隐匿”了被代理的机器, ...

随机推荐

  1. Ext.Net 使用总结之GridPanel中的选中行

    1.判断GridPanel中是否选中了某行 if (!GridPanel1.hasSelection()) { Ext.Msg.alert("提示", "请选择记录!&q ...

  2. iOS内购的订单对应和补单

    内购的关键类: 1.SKPayment(SKMutablePayment可将自己的参数一对一与苹果产生的payment对应起来) 2.TransactionObserver:交易状态更新时执行此方法, ...

  3. HDU OJ 5317 RGCDQ( 2015多校联合训练第3场) 暴力打表+小技巧

    题目连接:Click here 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(1 ...

  4. OpenGL学习之windows下安装opengl的glut库

    OpenGL学习之windows下安装opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.  Windows环境下的GLUT下载地址:(大小约为15 ...

  5. Aliyun EMR 集群重启

    1.如果Core节点有Down掉,ActiveNodes少于Core节点数. 处理: a.登陆到Master节点,到目录 /opt/apps/hadoop-2.7.2/sbin b.执行 ./stop ...

  6. 常用Android快速开发框架

    在做项目的过程中遇到了很多困难,于是收集了一些快速开发的框架,使用后大大提高了项目开发速度,无论什么项目都可以使用的到,在此分享给大家,希望能对大家有帮助!(个人建议:有时间的同学可以看一下这些优秀框 ...

  7. oracle slient静默安装并配置数据库及仅安装数据库不配置数据库shell

    <1,>仅安装数据库软件不配置数据库 ./x86oracle.sh /ruiy/ocr/DBSoftware/app/oracle /ruiy/ocr/DBSoftware/app/ora ...

  8. HDFS 2中Namenode启动时WebUI的变化

      在HDFS1中NameNode启动顺序是这样的: 1. 读取Fsimage文件 2. 读取edit logs文件,逐行执行里面的操作 3. 写checkpoint,生成新的Fsimage(老的Fs ...

  9. ios app唤起页面跳转

    有些时候我们需要再其他地方把app唤起,并打开跳转到指定的vc上面.这里我自己写了一个vc的mgr,最主要的技术是method swizzle.原理就不详述,看代码吧. // // ViewContr ...

  10. 【技术引擎——汇聚IT思想之间的碰撞】

    转载请注明作者和出处:http://blog.csdn.net/pearyangyang/article/details/40869825    谢谢. 这篇博客将记录我所学习的那些博客大牛,方面以后 ...