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//必须要实现的方法( ...
随机推荐
- Codeforces Round #264 (Div. 2)
http://codeforces.com/contest/463 这场是我人生第一场cf啊.. 悲剧处处是啊. 首先,看不懂题,完全理解不了啊.都是wa了好几次才过的 所以a和b这两sb题我做了1个 ...
- javascript第四弹——变量、作用域、内存
一.变量 定义 变量是松散型的 变量是保存特定值的一个名字 变量包含两种数据类型的值:基本数据类型的值和引用数据类型的值 基本数据类型值 基本数据类型值是一个简单的数据段,在内存中占用固定的空间,保存 ...
- Vim 学习资料
VIM中文手册 简明 Vim 练级攻略 所需即所获:像 IDE 一样使用 vim
- C++ Split string into vector<string> by space
在C++中,我们有时候需要拆分字符串,比如字符串string str = "dog cat cat dog"想以空格区分拆成四个单词,Java中实在太方便了,直接String[] ...
- sql中写标量函数生成大写拼音首字母
USE [StockManageSystemV2] GO /****** Object: UserDefinedFunction [dbo].[PinYin] Script Date: 2016-08 ...
- linux ext2 文件系统学习
Linux ext2文件系统理解 硬盘组成: 硬盘由多个圆形硬盘片组成.按照硬盘片能够容纳的数据量分为单盘和多盘.硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头.机械手臂不动硬盘旋转一 ...
- .net 后台设置meta的属性(keywords,description)
首先在前台aspx文件中的head标记添加runat="server"的属性. 之后后台如下编写: protected void Page_Load(object sender, ...
- 我对Java的java.lang.Class这个类的深入理解
类是对同一类事物的描述,字段具体的值只有到类实例化时才会指定,静态字段除外.所有的类也是同一类事物,用Class这个类来描述.Class类与String.Person等类是同一个级别的.java的字节 ...
- [APAC]手动截取当前活动窗口,并且按规则命名(1/2)
Function Take-ScreenShot { <# .SYNOPSIS Used to take a screenshot of the desktop or the active wi ...
- 【iHMI43真彩液晶模块】发布新版 DEMO 软件包,版本号为 0.14
新版DEMO软件包主要在以下几个方面进行了改进: 1.改进触摸算法,使用链表注册模式:注册触摸按键后:用户只需要处理事件(event)就行了,其他都由系统完成: 2.改进systick 和 usart ...