iOS——protoco和delegate (事件代理)
一:被代理人personOne
personOne.h
#import <Foundation/Foundation.h>
@protocol SomeThing<NSObject> //需要被代理的事件
- (void)doSomeThing:(NSString *)someThing; @end
@interface PersonOne : NSObject //有件事情需要别人替自己做
//代替自己的人必须要会做这个事情,需要知道了解相关的协议;
@property(weak)id <SomeThing> delegate;
@end
二:代理人personTwo
personTwo.h
#import <Foundation/Foundation.h>
#import "PersonOne.h" @interface PersonTwo : NSObject<SomeThing>
//加上<SomeThine>表示代理人知道了相关协议,可以接手代理。
@end
personTwo.m
#import "PersonTwo.h" @implementation PersonTwo
//代理开始去做被代理方交代的事情(必须实现)
-(void)doSomeThing:(NSString *)someThing
{
NSLog(@"%@............",someThing);
}
@end
三.双方真正的实现相互关联
main.m
#import <Foundation/Foundation.h>
#import "PersonTwo.h"
#import "PersonOne.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
//真正的实现代理与被代理之间的关联
PersonOne *pA = [[PersonOne alloc]init]; PersonTwo *pB = [[PersonTwo alloc]init]; //pB代替pA去完成事件
pA.delegate = pB; //用 pA.delegate 判断是否存在pB
//用 [pA.delegate respondsToSelector:@selector(doSomeThing:)] 判断pB是否实现了要求的方法。
if (pA.delegate && [pA.delegate respondsToSelector:@selector(doSomeThing:)]) {
//pA提供一个参数给pB(只负责提供参数,不管具体使用)
[pA.delegate doSomeThing:@"hello world"];
}
}
return 0;
}
用一个形象的比喻来说明这一整个代理事件:
一个咖啡厅生意非常好,老板 (personOne) 决定招一个咖啡师来帮忙。于是就贴出了一则公告 (delegate)
公告内容:(protocol)
招聘一名咖啡师,有一年经验以上。会调酒者优先录取。
从这个公告中,可以知道两点:
1-会做咖啡,并且有一年以上的经验是 必须的条件 (@required:必须实现的方法)
2-会调酒是 可选,非必须的条件 (@optional:可选 实现的方法(可以全部都不实现))
所以,凡是前来应聘的必须都要满足第一个条件,第二个条件只是加分项而已,并非不可缺的。
招到了员工B以后,老板要求B做一杯摩卡。至于B怎么做,老板是不会关心的,他只关心结果。
([pA.delegate doSomeThing:@"hello world"];) ——》[老板.delegate 做咖啡:@"摩卡"];
iOS——protoco和delegate (事件代理)的更多相关文章
- ios中关于delegate(委托)的使用心得
ios中关于delegate(委托)的使用心得 分类: iOS开发2012-05-15 10:54 34793人阅读 评论(9) 收藏 举报 iosuiviewtimerinterfaceprinti ...
- IOS 如何选择delegate、notification、KVO?
IOS 如何选择delegate.notification.KVO? 博客分类: IOS 前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有 ...
- 【iOS系列】-触摸事件与手势识别
[iOS系列]-触摸事件与手势识别 第一:触摸事件 一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 UIEvent:称为事件对象,记录事件产生的时刻和类型 两根手指同时触摸一个view ...
- Atitit事件代理机制原理 基于css class的事件代理
Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...
- js事件代理(委托)
JavaScript事件代理(委托)一般用于以下情况: 1. 事件注册在祖先级元素上,代理其子级元素.可以减少事件注册数量,节约内存开销,提高性能. 2. 对js动态添加的子元素可自动绑定事件. 之前 ...
- JS 事件代理
事件处理器:onclick.onmouseover.... 在传统的事件处理中,你需要为每一个元素添加或者是删除事件处理器.然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越 ...
- jquery事件代理
在jQuery中,事件代理是指:把事件绑定到父级元素,然后等待事件通过DOM冒泡到该元素时再执行. 在事件侦听过程中有两种触发事件的方式:事件捕获和事件冒泡.事件冒泡更快,效率更高. 事件捕获:事件在 ...
- js事件代理
需要注意的blog:http://blog.csdn.net/majian_1987/article/details/8591385 一篇博客看懂 http://blog.csdn.net/maji ...
- JS中事件代理与委托
在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...
随机推荐
- C# 扩展方法克隆实体类
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Ru ...
- Contains Duplicate,Contains Duplicate II,Contains Duplicate III
217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your ...
- GetClientRect()和GetWindowRect()
GetClientRect() 是得到客户区坐标系下客户区的RECT GetWindowRect()是得到屏幕坐标系下整个窗口的RECT GetSystemMetrics()是获得屏幕分辨率大小 ...
- Oracle11g R2学习系列 之三教程选择
工欲善其事必先利其器,选择一本入门教程也是很重要的,本人使用的也是这位同事推荐的电子工业出版社的<<Oracle 实用教程(第3版)>>郑阿奇主编,可以至这里购买到,我个人还是 ...
- jQuery封装的表单验证,模仿网易或者腾讯登录的风格
模仿网易邮箱做了一个登录表单验证,不太好,请指教 上代码 <form action="" name="" id="form1"> ...
- DoctrineMigrationsBundle
数据库迁移特征是数据库抽象层的扩展,允许你用编程的方式,安全.方便.标准化实现数据库结构的更新. 安装 首先使用composer安装 $ composer require doctrine/doctr ...
- PHP & JAVA 实现 PBKDF2 加密算法
PHP代码: /** * PBKDF2 加密函数 * 参考标准 * @link https://www.ietf.org/rfc/rfc2898.txt * * php官方函数将在php5.5发布 * ...
- sqlserver2008 case when then else end
在写sql语句的时候,有时候我们需要对字段的只进行判断计算.查看了下相关文档在sql2012.sql2014里边可以使用 IIF 函数直接完成. 但是现在我需要在sql2008版本中完成最字段的计算 ...
- 在Fragment中使用BaiduMap SDK
1:fragment_bshdzh.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- 【转】如何在ubuntu12.04设置adb驱动
原文网址:http://www.xuebuyuan.com/1475698.html 在ubuntu上adb驱动不用像在windows上一样需要额外装,只需要写一个配置文件就可以,下面是设置的步骤: ...