1 协议:

协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法。
它是对对象行为的定义,也是对功能的规范。

在写示例之前我给大家说下@required和@optional这两个关键字

他们两个是在声明协议的时候用到,@required是必须实现的方法,要不会报黄色警告.@optional是可选实现!实现还是不实现都不会报警告!

示例:

1
2
3
4
5
6
7
8
9
//
GoodChild.h

#import

@protocol GoodChild

-(void)filialPiety;

@end

1
2
3
4
5
6
7
8
//
Student.h

#import
#import
"GoodChild.h"
//注意实现协议的语法。

@interface Student : NSObject

@end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//
Student.m
//
protocol
//
//
Created by sxt on 11-10-23.
//
Copyright 2011年 __MyCompanyName__. All rights
reserved.
//

#import
"Student.h"

@implementation Student

- (id)init
{
self = [super init];
if (self) {
//
Initialization code here.
}

return self;

}
-(void)filialPiety{
NSLog(@"孝敬父母。。");
}
@end

此例中定义了一个协议GoodChild,类Student实现了此协议,所以必须有filialPiety方法。
每个类虽只有一个父类,但可以实现多个协议,以逗号隔开便可。语法如下:

1
2
3
@interface Student : NSObject<协议1,协议2>

@end

2 委托:

委托是objC中使用非常频繁的一种设计模式,它的实现与协议的使用是分不开的,让我们看一个综合示例:
小公司老板日常的工作是管理公司、教导新员工、发工资与接电话。
其中管理公司、教导新员工是老板要亲为的。
而发工资与接电话老板希望招聘一个秘书来帮忙,于是对秘书的要求就是要略懂出纳发工资,要能帮助领导接电话。
而这两项要求便是协议,对类功能的限定。

1
2
3
4
5
6
7
8
9
10
11
//
SecProtocol.h

#import

@protocol SecProtocol

//发工资
-(void)payoff;
//接电话
-(void)tel;

@end

然后定义一个秘书类

1
2
3
4
5
6
7
//
Sec.h

#import
#import
"SecProtocol.h"
@interface Sec : NSObject

@end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
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

紧接着是老板类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//
Boss.h

#import
#import
"SecProtocol.h"
@interface Boss : NSObject

//此属性用于指定秘书对象,此对象必须实现SecProtocol协议。

@property(nonatomic,retain) id
detegate;
//管理
-(void)manage;
//教导新员工
-(void)teach;

@end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//
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个时则转为调用秘书的方法。
此时我们跟秘书对象就叫做代理对象,代理模式的名字由来于此。
最后调用测试下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//
main.m
//
delegate
//
//
Created by sxt on 11-10-23.
//
Copyright 2011年 Jinlong Wei. All rights reserved.
//

#import
#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 0;

}

IOS开发之----协议与委托(Protocol and Delegate) 实例解析的更多相关文章

  1. 【转】iOS 开发之协议protocal-代理传值delegate

    原文网址:http://www.cnblogs.com/wzrong/p/3201938.html 刚开始做iOS开发的时候,对 protocol.delegate 的理解一直都是晕晕乎乎一知半解的状 ...

  2. iOS 开发之协议-代理传值

    刚开始做iOS开发的时候,对 protocol.delegate 的理解一直都是晕晕乎乎一知半解的状态,不知道两个UIViewController之间怎么进行传值. 面试过几个童鞋,问道怎么用 del ...

  3. 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  4. Ios开发之协议protocol

    Protocol是ios开发中的一个难点也是一个重点,要想使用好,或者理解好它,可能需要时间的累积.今天我们就通过一个例子来简单的看一下,怎么样使用protocol. 我们今天用的例子就是模拟电脑插入 ...

  5. IOS开发-OC学习-protocol(协议)

    在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法. 例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法:学 ...

  6. iOS开发总结——协议代理的认识

    1.前言 自今年5月底正式转iOS之后,天天get新技能,很多技能在脑子里回旋不吐不快,所以,写点东西整理一下.先从协议代理开始. 2.协议方法的声明 @protocol EventMenuBarDe ...

  7. 传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)

    本文转载至  http://blog.csdn.net/learnios/article/details/8442201 分类: 功能模块2012-12-27 10:22 109人阅读 评论(0) 收 ...

  8. iOS开发HTTP协议相关知识总结

    HTTP原理 什么是URL URL中常见的几种协议 什么是HTTP协议 HTTP是做什么的 为什么要使用HTTP协议 HTPP协议的通信过程介绍 HTTP请求 HTTP响应 HTTP请求的选择 两种发 ...

  9. IOS开发学习笔记015-block和protocol

    一.block block 代码段    标识是 ^    block 和函数很像 1.可以保存代码 2.有返回值 3.有形参 格式 返回值 (block名)(形参列表) = ^(形参列表) {代码段 ...

随机推荐

  1. head first 设计模式读书笔记 之 策略模式

    作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php ...

  2. 使用verilog实现4选1数据选择器的几种方法

    第一种方法module mux( d1, d2, d3, d4, se1, se2, dout ); input d1; input d2; input d3; input d4; input se1 ...

  3. Oracle EBS-SQL (SYS-9):职责使用菜单.sql

    select aa.menu_name, aa.user_menu_name, aa.type,                 aa.description, aa.ENTRY_SEQUENCE, ...

  4. [原]基于CAS实现单点登录(SSO):cas client端的退出问题

    自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST ...

  5. poj 3273 Monthly Expense (二分搜索,最小化最大值)

    题目:http://poj.org/problem?id=3273 思路:通过定义一个函数bool can(int mid):=划分后最大段和小于等于mid(即划分后所有段和都小于等于mid) 这样我 ...

  6. [LeetCode][Python]Integer to Roman

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/integer ...

  7. Pascal 线段树 lazy-tag 模板

    先说下我的代码风格(很丑,勿喷) maxn表示最大空间的四倍 tree数组表示求和的线段树 delta表示增减的增量标记 sign表示覆盖的标记 delta,sign实际上都是lazy标志 pushd ...

  8. extend vg(pv,lv)use HotPlug Storage PV for VMI(ECC Env)

    Preface: 前期存储未规划好,业务快速扩展,数据高安全需求(异地,More one copy),需求多多?NM干着干着活就会时不时的坑爹起来了!particularly Real Product ...

  9. 数学之路-python计算实战(13)-机器视觉-图像增强

    指数变换的基本表达式为:y=bc(x-a)-1 当中參数b.c控制曲线的变换形状,參数a控制曲线的位置. 指数变换的作用是扩展图像的高灰度级.压缩低灰度级.能够用于亮度过高的图像 本博客全部内容是原创 ...

  10. 今天,Java编程周末提高班(第一期)正式结束

    Java编程周末提高班(第一期),走过了近两个月历程,一共同拥有68人次学生周末到老师家进行Java学习与交流.近距离的和一群年轻的学习接触,收获非常多,特别是对以后教学的改进.在学习的闲暇.大家自己 ...