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相关的接口.这些接口又有什么 ...
随机推荐
- 调用具体webservice方法时时报错误:请求因 HTTP 状态 503 失败: Service Temporarily Unavailable
添加web引用会在相应项目的app.cofig文件中产生如下代码: <sectionGroup name="applicationSettings" type="S ...
- 简单的批量读取外部insert文并插入DB
package com.tongxiang.item.base.dao; import java.io.BufferedReader; import java.io.File; import java ...
- VC连接数据库方式
转自:http://www.cnblogs.com/renyuan/archive/2012/07/27/2612412.html 目前Windows系统上常见的数据库接口包括: ODBC(开放数据库 ...
- 表单同时有中文字段和文件上传,加上enctype="multipart/form-data"后导致的中文乱码问题
因为一个表单需要同时上传字段和文件,所以加上enctype="multipart/form-data",但是上传后的中文字段变成了乱码. 把enctype="multip ...
- ios 多线程 面试
1 多线程是什么 同步完成多项任务,提高了资源的使用效率,从硬件.操作系统.应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色 ...
- 开心菜鸟系列----函数作用域(javascript入门篇)
1 <!DOCTYPE html> 2 <html> 3 <script src="./jquery-1.7.2.js"></ ...
- Uubntu14.04 LST安装NodeJS
1:从官网下载node.js源码http://nodejs.org/download/ 当前最新版为node-v0.10.33 2:安装 $ tar zxvf node-v0.10.33.tar.gz ...
- Codeforces 372B Counting Rectangles is Fun
http://codeforces.com/problemset/problem/372/B 题意:每次给出一个区间,求里面有多少个矩形 思路:预处理,sum[i][j][k][l]代表以k,l为右下 ...
- AQS详解
一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...
- Unix/Linux环境C编程入门教程(40) 初识文件操作
1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...