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.匿名代理:完全“隐匿”了被代理的机器, ...
 
随机推荐
- Qt程序设计——txt文本中获取字符串的问题
			
QT对txt文本进行读写一般是采用QFile和QTextStream结合使用,在此不细说,主要说一下读取txt文本的注意事项.因为txt文本中有中文也有英文还有数字,要准确获得需要的字串可就要多一个心 ...
 - JSP简单练习-获取表单数据
			
在JSP中,server端程序与client交互最经常使用的方法就是採用表单提交数据.表单提交的方法主要有两种,一种是get方法.还有一种是post方法.两者最大的差别:使用get方法提交的数据会显示 ...
 - CSS3立体文字最佳实践
			
前端开发whqet,csdn,王海庆,whqet,前端开发专家 上一篇的<纯CSS3文字效果推荐>文章里面推荐了8款纯css实现的文字效果,当中3d文字效果最为流行,限于篇幅只展示了其3D ...
 - UCML破解
			
最近一直加班,好久没更新了.无良的产品经理一直催着修改功能,本想把活带回家做..结果...公司就一个UCML的加密狗...闹心....想办法破解: 1.狗复制,这个没搞过,某宝上有帮忙复制的,联系了一 ...
 - HTML5新增加的功能
			
1.部分代码代替了以前的代码 例如: 获取焦点 旧:document.getElementById("price");.focus; 新:<input ...
 - js生成验证码并且判断
			
<style type="text/css"> .code { font-family: Arial; ...
 - POJ1323-Game Prediction
			
描述: Suppose there are M people, including you, playing a special card game. At the beginning, each p ...
 - 保存属性至xml并读取
			
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
 - poj 2584 T-Shirt Gumbo  网络流
			
题目链接 有5种T-shirt, n个人, 每个人可以接受某些种T-shirt, 每种T-shirt的数量已知, 问每个人能否都穿上自己能接受的T-shirt. 源点向每种T-shirt连边, 权值为 ...
 - zoj 2587 Unique Attack  最小割判定
			
题目链接 让你判断最小割是否唯一. 判断方法是, 先求一遍最大流, 然后从源点dfs一次, 搜索未饱和边的数目. 从汇点dfs一次, 同样也是搜索未饱和边的数目, 看总和是否等于n. 如果等于n那么唯 ...