Protocol and Delegate
为什么使用委托?
答:比如,我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户
(1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不方便自己做,所以我想找个助手(delegate)帮我做这些事,于是我定了一个招聘要求(Protocol),里写明我的助手需要会做(3)(4)(5)这三件事。很快,我招到一个助手。
我.delegate = 助手;
于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(delegate)去处理,助手处理完后如果有处理结果(返回值)助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。
1 协议(Protocol)
协议限制了实现类必须拥有哪些方法。它是对对象行为的定义,也是对功能的规范。
示例:
// GoodChild.h
#import <Foundation/Foundation.h>
@protocol GoodChild <NSObject>
-(void)filialPiety; //孝顺
@end
// Student.h
#import <Foundation/Foundation.h>
#import "GoodChild.h"
//注意实现协议的语法。
@interface Student : NSObject<GoodChild>
@end // Student.m
#import "Student.h"
@implementation Student
- (id)init {
self = [super init];
if (self) { // Initialization code here.}
return self;
}
-(void)filialPiety{ NSLog(@"孝敬父母。。");}
@end
此例中定义了一个协议GoodChild,类Student实现了此协议,所以必须有filialPiety方法。每个类虽只有一个父类,但可以实现多个协议,以逗号隔开便可。语法如下:
@interface Student : NSObject<协议1,协议2>
@end
2.委托(Delegate)
委托是objC中使用非常频繁的一种设计模式,它的实现与协议的使用是分不开的。
让我们看一个综合示例:小公司老板日常的工作是管理公司、教导新员工、发工资与接电话。其中管理公司、教导新员工是老板要亲为的。而发工资与接电话老板希望招聘一个秘书来帮忙,于是对秘书的要求就是要略懂出纳发工资,要能帮助领导接电话。而这两项要求便是协议,对类功能的限定。
// SecProtocol.h
#import <Foundation/Foundation.h>
@protocol SecProtocol <NSObject>
//发工资
-(void)payoff;
//接电话
-(void)tel;
@end
然后定义一个秘书类:
// Sec.h
#import <Foundation/Foundation.h>
#import "SecProtocol.h"
@interface Sec : NSObject<SecProtocol>
@end // Sec.m
#import "Sec.h"
@implementation Sec
- (id)init {
self = [super init];
if (self) {
// Initialization code here. }
return self; }
-(void)payoff{ NSLog(@"sec payoff"); }
-(void)tel{ NSLog(@"sec tel"); }
@end
紧接着是老板类:
// Boss.h
#import <Foundation/Foundation.h>
#import "SecProtocol.h"
@interface Boss : NSObject
//此属性用于指定秘书对象,此对象必须实现SecProtocol协议。
@property(nonatomic,retain) id<SecProtocol> detegate;
//管理
-(void)manage;
//教导新员工
-(void)teach;
@end // Boss.m
#import "Boss.h"
@implementation Boss
@synthesize detegate=_detegate;
- (id)init {
self = [super init];
if (self) { // Initialization code here.}
return self; }
-(void)manage{
NSLog(@"boss manage"); }
-(void)teach{
NSLog(@"boss teach"); }
-(void)payoff{
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];
[_detegate payoff];
[p release]; }
-(void)tel{
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];
[_detegate tel];
[p release]; }
@end
那么老板就具有这4个方法,当调用前2个时是自己完成功能,而调用后2个时则转为调用秘书的方法。此时我们跟秘书对象就叫做代理对象,代理模式的名字由来于此。最后调用测试下:
// main.m #import <Foundation/Foundation.h>
#import "Boss.h"
#import "Sec.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//实例化老板对象
Boss *boss=[[[Boss alloc] init] autorelease];
//实例化秘书对象
Sec *sec=[[[Sec alloc] init] autorelease];
//设置老板的代理对象为秘书
boss.detegate=sec;
//调用4个方法。
[boss payoff];
[boss tel];
[boss manage];
[boss teach];
[pool drain];
return ;
}
Protocol and Delegate的更多相关文章
- 传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)
本文转载至 http://blog.csdn.net/learnios/article/details/8442201 分类: 功能模块2012-12-27 10:22 109人阅读 评论(0) 收 ...
- 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 示例: 1 2 3 4 5 6 7 8 9 // GoodChild.h ...
- ios回调函数的标准实现:protocol+delegate
一.项目结构
- Protocol and Delegate协议和代理
1.什么是协议? OC协议仿照Java的接口.协议和接口,都是不同类的对象之间一种通信的机制.2.协议的基础语法 单纯的语言描述协议的语法,很难让人理解,主要因为在OC中协议是类对象的通信机制,他 ...
- IOS开发之----协议与委托(Protocol and Delegate) 实例解析
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 在写示例之前我给大家说下@required和@optional这两个关键 ...
- iOS开发之protocol和delegate
protocol--协议 协议是用来定义对象的属性,行为和用于回调的. 协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...
- protocol 和delegate(协议和代理)的区别
定义 protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话): delegate:中文叫代理或委托, ...
- Protocol, Delegate
协议的构成: 协议:用来指定代理双方可以做什么,必须做什么. 代理:根据指定的协议,完成委托方需要实现的功能. 委托:根据指定的协议,指定代理去完成什么功能. 协议的修饰符: 协议有两个修饰符@opt ...
- protocol 和 delegate
步骤 1.发出协议(在发协议者.h文件 下@interface-@end 上边) @protocol hireOneMaid <NSObject> @required//必须要实现的方法( ...
随机推荐
- BZOJ3790 : 神奇项链
Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ...
- CSS Counters 计数属性
CSS Counters其实就是一计数器,早期在CSS中计数器仅存在于ul和ol元素.如果要使用在div这样的元素上,只能通过list-style-image或者是元素的backgroud-image ...
- Robotium 测试方法
1.检查CheckBox 是否选上,用solo.isCheckBoxChecked( “text” ). 有时候checkBox 没有相关的text,这时要用solo.isCheckBoxChecke ...
- 【POJ】2187 Beauty Contest(旋转卡壳)
http://poj.org/problem?id=2187 显然直径在凸包上(黑书上有证明).(然后这题让我发现我之前好几次凸包的排序都错了QAQ只排序了x轴.....没有排序y轴.. 然后本题数据 ...
- python 操作execl文件
http://www.jb51.net/article/60510.htm import xlrdimport xlwt # 打开文件 workbook = xlrd.open_workbook( ...
- iOS真机调试的验证项
基本的匹配项 App 描述文件 BundleID (匹配) ApplicationID Cert (匹配) Cert DeviceID (被包含) DeviceIDs 描述文件就是包含了各种需要验证信 ...
- 1. while循环(当循环) 2. do{}while()循环 3. switch cose(多选一) 例子:当选循环下求百鸡百钱 用 switch cose人机剪刀石头布
1. while循环: 当选循环下求百鸡百钱:如下: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- 在Eclipse中配置Tomcat 创建和运行Servlet/JSP
在Eclipse中配置Tomcat 创建和运行Servlet/JSP 步骤一:在Eclipse中配置Tomcat(注意下载Eclipse IDE for Java EE Developers) (1) ...
- ThinkPHP之APP_DEBUG给我带来的问题
1.刚开始学习Thinkphp,在模块分组之后,自己配置了模块分组后,发现打不开网页了,分组配置如图 2.问题现象如图 在处理空模块时写的函数也不能运行 这时我很困惑,一直检查自己的拼写和配置没发现错 ...
- in_array 的第三个参数strict设置为 true
var_dump(in_array(0, array('s' )); 这句话的结果是bool(true). 因为in_array会将0 和's' 进行比较,0是number类型,'s'是string类 ...