类似Java的泛型与接口的结合体,用于类型的<>中,可以多继承(按照OC的说法叫遵从某些协议)
一个对象可以利用协议监听另一个对象状态的变化(相当于监听器的思想,一个对象要充当另一个对象的监听,必须遵守某个协议.为了区别具体哪个对象被触发,一般会把当前触发的对象做为参数传到接口方法中)
@protocol Client <NSObject>//声明协议,和@class的用法差不多 ,可以提高编译性能
-(void)defaultMethod;//默认必须实现
@required//必须
-(void)required;
@optional//可选
-(void)optional;
@end
2、符合(实现)协议
3、使用并调用回调#import "Client.h"//导入协议的头文件
@interface JackClient : NSObject<Client>
@end
@implementation JackClient
-(void)defaultMethod{
NSLog(@"this is defaultMethod");
}
-(void)required{
NSLog(@"this is required method");
}
@end
#protocol JackClient
@interface Test : NSObject<Client>{
id<Client> client;
}
-(id)initWithClient:(id<Client>) client;//id<Chient>表示id遵守了Client协议
-(void) turnTheCrank;
@property(retain) id<Client> client;
@end
@implementation Test
-(id)initWithClient:(id<Client>)client{
self = [super init];
if (self) {
_client = client;
}
return self;
}
-(void) turnTheCrank{
[self.client defaultMethod];
[self.client required];
if ([self.client respondsToSelector:@selector(optional)]) {//可选回调可先判断是否实现,再调用
[self.client optional];
}
}
@end
类+<>表示遵守了某个协议
respondsToSelector:判断某个对象有没有实现某个方法 ,([self.client respondsToSelector:@selector(optional)]) :判断client有没有实现optional方法