协议就相当于是C++中的纯虚基类,它只能定义函数并且只能由其他类来实现。而委托则类似于Java接口,其实协议和委托之间并无必然联系,只是在Obj—C中常用协议来实现委托。
protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
注意以下几点:
1.协议声明了可以被任何类实现的方法;
2.协议不是类,它是定义了一个其他对象可以实现的接口 ;
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。
5.在协议的声明中的特性关键字:
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法
下面来举个栗子:
1)一个人(custom)去饭店吃饭,custom要下订单-(void)ordor;,这时候waiter来了,为cumstor服务。
2)当custom吃晚饭要付款了-(void)pay;,这是后waiter过来收款,custom付款。
首先先创建一个协议
#import <Foundation/Foundation.h> @protocol Manager <NSObject> @required -(void)order;//下订单 -(void)pay:(int)x;//付款 @end
首先是一个顾客类,由于顾客要将服务的事情都交给服务员处理,所以在让顾客实现Manager这个协议,成为委托人,以下是头文件:
#import <Foundation/Foundation.h>
#import "Manager.h"
@interface Custom : NSObject<Manager>//引入协议的概念
@property (nonatomic,weak) id delegate;
@end
以下是.m文件:
#import "custom.h"
@implementation Custom
@synthesize delegate=_delegate;
-(id)init{
if (self=[super init]) {
//
}
return self;
}
-(void)order{
[_delegate order];//让接受委托的人去执行订单任务
}
-(void)pay:(int)i{
[_delegate pay:i];//让接受委托的人去执行收款的任务
}
@end
然后,我们来实现服务员的类,导入"Manager.h"这个协议的头文件,实现协议中的方法
#import <Foundation/Foundation.h>
#import "Manager.h"
@interface Waiter : NSObject
@end
以下是.m文件:
#import "waiter.h"
@implementation Waiter
-(id)init{
if (self=[super init]) {
//
}
return self;
}
-(void)order{
NSLog(@"服务员过来为顾客服务\n");
}
-(void)pay:(int)i{
NSLog(@"服务员过来收钱:%d\n",i);
}
@end
#import <Foundation/Foundation.h>
#import "custom.h"
#import "waiter.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Waiter * w=[[Waiter alloc] init];
Custom * c=[[Custom alloc] init];
c.delegate=w;
[c order];
[c pay:1000];
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}