关于协议有几个名词:协议、代理、委托,事实上这些都是描述一件事情。
协议的用法:
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类的方法。
这里用协议给了这种调用一个限制,看起来就高深了一点点。
#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;
}

支付宝打赏
微信打赏