object-c 协议(Protocols)和代理(Delegation)的学习
代理是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)的学习的更多相关文章
- 协议(Protocol) 和代理(Delegate)
1.概念与组成 delegate是iOS中一种常见的设计模式,是一种消息传递的的方式,常见的消息传递方式还有以下几种: 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. ...
- [SuProxy]Ngnix+Lua 实现SSH2,LDAP,ORACLE,SQLSERVER等TCP/IP协议分析,劫持,代理,会话及负载
目录 目录 目录 前言 介绍 安装 下载并拷贝 使用LuaRocks安装 运行测试 使用简介 处理器(processor)创建 通道(channel)创建 负载均衡 会话信息和会话管理 Event H ...
- Welcome-to-Swift-21协议(Protocols)
协议定义了一个方法的蓝图,属性和其他适合特定任务或功能的要求.协议实际上并不提供一个这些要求的实现,它只是描述了一个实现会是什么样子.协议可以通过一个类,结构或枚举提供这些要求的具体实现.满足要求的任 ...
- HTTP权威协议笔记-6.代理
6.1 Web的中间实体 Http的代理服务器即是客户端的服务器又是服务器的客户端. 它介于服务器与客户端之间,当客户端发送请求报文经过它时,它会像服务器一样正确的处理请求和返回响应,同时,代理服务器 ...
- 浅谈iOS开发的协议(protocol)和代理(delegate)
协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...
- HTTP协议5之代理--转
代理服务器 Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色. HTTP的代理服务器即是Web服务器又是Web客户端. Fiddler就是 ...
- http协议与http代理
TCP/IP协议族 TCP/IP(Transmission Control Protocol/InternetProtocol.传输控制协议/网际协议)是用于计算机通信的一个协议族. TCP/IP协议 ...
- Object.defineProperties()与Proxy对象代理
Object.defineProperties() 了不起啊..vue.js通过它实现双向绑定的 Object.defineProperties(obj,props) 方法直接在一个对象上定义新的属性 ...
- HTTP协议复习二--代理
代理(Proxy)是HTTP协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客 户端的请求,也可以转发服务器的应答.代理有很多的种类,常见的有:1.匿名代理:完全“隐匿”了被代理的机器, ...
随机推荐
- Linux系统CentOS6.2版本号下安装JDK7具体过程
前言: java 是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE( ...
- .net 文件下载
/** 输入参数* _Request: Page.Request 对象* _Response: Page.Response 对象* _fileName: 下载文件名* _fullPath: 带文件名下 ...
- SQL练习之求解填字游戏
SELECT * FROM dbo.spt_values
- JAVA 语 言 如 何 进 行 异 常 处 理 , 关 键 字 : throws,throw,try,catch,final
throws是获取异常throw是抛出异常try是将会发生异常的语句括起来,从而进行异常的处理,catch是如果有异常就会执行他里面的语句,而finally不论是否有异常都会进行执行的语句.
- Problem F: Exponentiation大数求幂
DescriptionProblems involving the computation of exact values of very large magnitude and precision ...
- Linux学习之chage命令
功能:修改帐号和密码的有效期限用法:chage[-l][-m mindays][-M maxdays][-I inactive][-E expiredate][-W warndays][-d last ...
- ExtJS 4.2学习(一)——环境搭建
1.把JDK集成到myeclipse里: 虽然myeclipse自带了jdk,但我们还是配置自己的JDK1.7 window——>Proferences——>Java——>Compl ...
- vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)
vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ...
- Hyperworks、Nastran、Abaqus与ansys的区别
hypermesh不过是前处理,radioos就是hm的求解器,也是非常强大的可以处理很多非线性问题,最重要的是hm的优化功能强大.比那几个好一些.abaqus适合非线性分析,尤其是接触分析.nast ...
- Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分
本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...