iOS 协议 委托

在iOS开发中协议和委托是两个密不可分的两个东西,但是他们是两个不同的设计模式,协议是一种规范,它定义一些协议接口方法,但是不管协议方法的实现,遵循了协议的类就具备了这种协议方法的能力。委托是一种简单的设计模式,和一种设计思想,他是一个类完成了本类中的一些事情交给另一个类完成的途径。通过委托别的类,来掉协议里的方法实现,委托是oc中的一种多继承的表现。

protocol 协议:

一个完整协议定义如下:
@protocol  协议名
声明方法
@end
其中"声明方法"可以用@required和@optional关键字修饰:
@required 表示我们用到这个协议的时候必须实现这个协议的方法
@optional 表示我们可选择性实现这些方法。
一个类需要遵循的协议在接口声明中的<>填写即可。
  1. @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开发中我们通常都是协议和委托一起使用,利用协议实现委托,如下代码示例:

  1. //制定协议  
  2. //protocol.h  
  3. #import   
  4. @protocol tekuba_net   
  5. //起草文件  
  6. -(void)draftDocuments;  
  7. //接电话  
  8. -(void)tel;  
  9. @end  
  10.   
  11. //秘书类  
  12. // Sec.h  
  13. #import   
  14. #import "protocol.h"  
  15. @interface Sec NSObject  
  16. @end  
  17. //Sec.m  
  18. #import "Sec.h"  
  19. @implementation Sec  
  20. (id)init  
  21.  
  22.     self [super init];  
  23.     if (self)  
  24.     // Initialization code here.  
  25.      
  26.     return self;  
  27.  
  28. -(void)draftDocuments  
  29.  
  30.     NSLog(@"sec draft documents");  
  31.  
  32. -(void)tel  
  33.  
  34.     NSLog(@"sec tel");  
  35.  
  36. @end  
  37. //老板类  
  38. // Boss.h  
  39. #import   
  40. #import "protocol.h"  
  41. @interface Boss NSObject  
  42. //很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate  
  43. @property(nonatomic,retain) id detegate; //必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。  
  44. //管理公司  
  45. -(void)manage;  
  46. @end  
  47. // Boss.m  
  48. #import "Boss.h"  
  49. @implementation Boss  
  50. @synthesize detegate=_detegate;  
  51. -(id)init  
  52.  
  53.     self [super init];  
  54.     if (self)  
  55.     // Initialization code here.  
  56.      
  57.     return self;  
  58.  
  59. -(void)manage  
  60.  
  61.     NSLog(@"boss manage");  
  62.  
  63. -(void)draftDocuments  
  64.  
  65.     NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];  
  66.     [_detegate draftDocuments];  
  67.     [p release];  
  68.  
  69. -(void)tel  
  70.  
  71.     NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];  
  72.     [_detegate tel];  
  73.     [p release];  
  74.  
  75. @end  
那么老板就具有这3个方法,当调用前1个时是自己完成功能,而调用后2个时则转为委托调用秘书的方法。
测试用例如下:
  1. main.m  
  2. #import   
  3. #import "Boss.h"  
  4. #import "Sec.h"  
  5. int main (int argc, const char argv[])  
  6.  
  7.     NSAutoreleasePool pool [[NSAutoreleasePool alloc] init];  
  8.     //实例化老板对象  
  9.     Boss *boss=[[[Boss alloc] init] autorelease];  
  10.     //实例化秘书对象  
  11.     Sec *sec=[[[Sec alloc] init] autorelease];  
  12.     //设置老板的代理对象为秘书  
  13.     boss.detegate=sec;//关键代码     
  14.     //调用各个方法。  
  15.     [boss draftDocuments];  
  16.     [boss tel];  
  17.     [boss manage];  
  18.     [pool drain];  
  19.     return 0;  

通过协议委托可以进行对象之间传值,把要传的值通过参数的形式,在协议方法中传。(就不用代码展示了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值