在ios中,提到协议(protocol)必然涉及代理(delegate), 反之亦然。
1. 协议:在ios中没有其他语言的接口或是虚函数这一说,但是有一个类似的功能,就是协议:声明一组方法规范。
下面以租房为例:
//协议
@protocol rentRoom<NSObject>
@requested
-(void)getRoom; // 找房子
@optional:
-(int)price;
-(CGFloat)area;
@end
中介看到了我贴的这份租房协议,想挣点中介费,就开始帮我推荐符合上述的房子。
//.h
//中介
@interface Intermediary:NSObject<rentRoom>
@end
//.m
@implement Intermediary
-(int)price{
return 2000;
}
-(void)getRoom{
return YES;
}
-(CGFloat)area{
return 32.5;
}
@end
上述就是协议,看完之后,是不是觉得这不是借口,或者说是虚函数吗?这么理解也没错,但有点偏差,ios的继承是@interface subClass:supClass,
协议是@interface subClass:supClass<youProtocal>或是@interface youClass<youProtocal>,这里叫遵守某个协议,不是继承!
另外,我们知道ios不支持多继承,但是可以遵守多个协议,多个协议之间用逗号隔开,从而实现类似的共功能功能:
@interface subClass:supClass<youProtocal, moyProtocal>
//TODO
@end
至于上面的@requested 和@optional是说明协议方法是否必须实现,前者必须是,后者可以不实现,但没有实现的请忽调用(事实是,这只是一个约定,声明为@requested,如果你用不到不实现也可以,但是会有烦人的警告);
2. 代理:是一种设计模式,但没必要特意先去看代理模式,不影响理解。
代理就是没有能力或是不想做弄事,使唤别人来做。
接着上面的租房子,我现在工作很忙,但又想换房子,所以我打个电话给中介,说我要找房子,我跟中介说了一下房子的条件(协议):价格是2000/月,面积是32平的,就是上面的rentRoom协议了
//.h 找房子类
@interface Me:NSObject{
@property (nonatomic, strong) Intermediary * _Intermediary; //中介
@property (nonatomic, assign) id<rentRoom> delegate;
}
-(void)setUpDelegate:(id<rentRoom>)dg;
-(void)findRoom;
@end
//.m
-(void)setUpDelegate:(id<rentRoom>)dg
self.delegate = dg;
}
-(id)init{
if([super init]){
_Intermediary =[[Intermediary alloc] init];
}
}
-(void)findRoom{
if([self.delegate responsesToSeletor[@selector(getRoom)]]){
[self.delegate getRoom];
}
}
Me类应该拥有代理(@property (nonatomic, assign) id<rentRoom> delegate),否则无法设置代理。
也就是说只要中介(代理)遵守了我制定的协议,不论是长寿路的,还是祥德路的中介,都可帮我我找房子,也就是成为我的代理。