关于协议有几个名词:协议、代理、委托,事实上这些都是描述一件事情。
协议的用法:
1.首先声明一个协议
@protocl 协议名 <父协议> //父协议可选
@required
…………方法声明
@optional
…………方法声明
@end
2.在一个类中实现协议中的方法,这个类可以称为被委托人,或者叫做代理
@interface 类A:父类名<协议名>
…..
协议方法1
协议方法2
…..
@end
3.在一个类中遇到协议中的问题时,可以委托代理人来调用
@interface 类B
@proterty id <协议名> 代理人变量p//随意命名的变量,至少有一个,待会会对它赋值
@end
@implementation 类B
协议方法1{ [代理人p 协议方法];}
@end
4.主程序中调用
A * a = [A new];
B * b = [B new];
b.p = a;//这里把代理类的一个对象赋值给B类的代理成员变量,意思是说B类遇到协议中的方法就可以交给A类的a对象去做了。称为委托。
[b 协议方法];// 他会调用A 类中的实现
看到这里,是不是有一种想法,这和普通的调用没什么区别,就是B类调用A类的方法。
这里用协议给了这种调用一个限制,看起来就高深了一点点。
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#import <Foundation/Foundation.h> @protocol Works <NSObject> @required - (void) payoff; - (void) tel; @optional - (void) dance; @end //工作协议,要求完成付款,打电话。可选完成跳舞任务 //=================== @interface Worker:NSObject <Works> //员工类,接受工作协议,实现工作方法 -(void) payoff; -(void) tel; -(void) dance; @end @implementation Worker -(void) payoff { NSLog(@"worker:payoff finish"); } -(void) tel { NSLog(@"worker:tel finish"); } -(void) dance { NSLog(@"worker:dance finish"); } @end//员工类对工作协议的实现 //========================== @interface Boss : NSObject @property id<Works> deleagate_people; //boss类,他包含一个属性,用于将任务给委托人; -(void) sing; @end @implementation Boss @synthesize deleagate_people; -(void) sing { NSLog(@"boss :sing"); } -(void) payoff { [deleagate_people payoff]; } -(void) tel { [deleagate_people tel]; } -(void) dance { [deleagate_people dance]; }//这些方法中都调用了协议,将任务交给委托人去完成 @end //================== int main(int argc, const char * argv[]) { @autoreleasepool { Boss *boss1 = [Boss new]; Worker * worker1 = [Worker new]; boss1.deleagate_people = worker1; [boss1 sing]; [boss1 dance]; [boss1 payoff]; [boss1 tel]; } return 0; } |