在iOS开发中协议和委托是两个密不可分的两个东西,但是他们是两个不同的设计模式,协议是一种规范,它定义一些协议接口方法,但是不管协议方法的实现,遵循了协议的类就具备了这种协议方法的能力。委托是一种简单的设计模式,和一种设计思想,他是一个类完成了本类中的一些事情交给另一个类完成的途径。通过委托别的类,来掉协议里的方法实现,委托是oc中的一种多继承的表现。
protocol 协议:
一个完整协议定义如下:
@protocol 协议名
声明方法
@end
其中"声明方法"可以用@required和@optional关键字修饰:
@required 表示我们用到这个协议的时候必须实现这个协议的方法
@optional 表示我们可选择性实现这些方法。
一个类需要遵循的协议在接口声明中的<>填写即可。
-
@protocol CCTestProtocol <NSObject>
@optional
-(void)test;
@required
-(void)test1;
@end
@property (nonatomic, assign) id<CCTestProtocol>delegate;
delegate 委托:
委托是一个简单的而强大的模式,实现一个对象允许另一个对象代表它完成某个操作或者实现相互协同操作。
下面是一个委托的示例:
类 A:
@interface A:NSObject
-(void)test;
@end
@implement A
-(void)test{
}
@end
类B:
@interface B:NSObject{
A *a_del;
}
@end
下面在mai()函数中实现委托机制:
void main()
{
B *
b
=[[B alloc]init];
A *
a
=[[A alloc]init];
b.a_del
=a;
[b.a_del test];
}
这样,最基本的委托机制就完成了,套用最通俗的一句解释:B需要完成一个print的操作,但他自己并没有实现这个操作,而是交给了A去完成,自己只是在需要时调用A中实现的print操作。
但是在iOS开发中我们通常都是协议和委托一起使用,利用协议实现委托,如下代码示例:- //制定协议
- //protocol.h
- #import
- @protocol
tekuba_net - //起草文件
- -(void)draftDocuments;
- //接电话
- -(void)tel;
- @end
-
- //秘书类
- //
Sec.h - #import
- #import
"protocol.h" - @interface
Sec : NSObject - @end
- //Sec.m
- #import
"Sec.h" - @implementation
Sec - -
(id)init - {
-
self = [super init]; -
if (self) { -
// Initialization code here. -
} -
return self; - }
- -(void)draftDocuments
- {
-
NSLog(@"sec draft documents"); - }
- -(void)tel
- {
-
NSLog(@"sec tel"); - }
- @end
- //老板类
- //
Boss.h - #import
- #import
"protocol.h" - @interface
Boss : NSObject - //很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate
- @property(nonatomic,retain)
id detegate; //必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。 - //管理公司
- -(void)manage;
- @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)draftDocuments
- {
-
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init]; -
[_detegate draftDocuments]; -
[p release]; - }
- -(void)tel
- {
-
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init]; -
[_detegate tel]; -
[p release]; - }
- @end
那么老板就具有这3个方法,当调用前1个时是自己完成功能,而调用后2个时则转为委托调用秘书的方法。
测试用例如下:
- main.m
- #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;//关键代码 -
//调用各个方法。 -
[boss draftDocuments]; -
[boss tel]; -
[boss manage]; -
[pool drain]; -
return 0; - }
通过协议委托可以进行对象之间传值,把要传的值通过参数的形式,在协议方法中传。(就不用代码展示了)