所谓的协议(delegate)就和Java中的接口差不多,在里面只能进行一些方法的声明。
OC也是单继承多实现的,而"实现",就是通过delegate“实现”的。相比于Java,OC中的协议的好处是,协议可以指定其所定的方法是否为必须实现。
还有一个Java的特性在OC中也可以使用,就是类似泛型。
定义参数的时候就可以通过<>指定这里的参数只能传入实现特定协议的类。如下代码:
id <BoyFriendProtocol>_boyFriend;
在OC中,id表示任何类型,<>表示这里限定的协议是BoyFriendProtocol。只有实现了BoyFriendProtocol协议的类才能作为参数传递给_boyFriend实例变量。
具体编码步骤;
1 自定义协议类
新建类的时候,本来应该选择Object-c.class,新建协议要选择Object-c protocol,因为协议类只需要头文件,没有实现文件。
所谓的自定义类就是在新建类的代码上加上实现基础协议接口。
@protocol BoyFriendProtocol <NSObject>
2 定义方法
类实现好了,剩下的就是在接口中定义希望其他类实现的方法。在这里,@required表明是其他类必须实现的方法,@optional表明是其他类可选择性实现的方法。
@protocol BoyFriendProtocol <NSObject>
@required
//shopping
- (void)makeMoney;
@optional
//做饭
- (void)cook;
//有趣
- (void)funny;
//打扫卫生
- (void)clean;
@end
3 在类中实现该协议,并实现没有实现的方法。
实现的方法是在类中引入协议文件,然后注明是实现的该协议,然后再实现必须实现的方法,还有任意数量的可选实现方法
头文件部分
#import "BoyFriendProtocol.h"
@interface Boy : NSObject <BoyFriendProtocol>
.m实现部分
//shopping
- (void)makeMoney{
NSLog(@"德胜门那");
}
//有趣
- (void)funny{
NSLog(@"请不要叫我逗比,再叫我他喵的要揍人了");
}
//打扫卫生
- (void)clean{
NSLog(@"搓衣板可以用来跪,也可以用来洗衣服");
}
以上就是协议(还是说成Java中接口比较好)的部分了,然后就是利用他的特性实现代理模式
所谓的代理模式,就是让别人去代替自己做东西呗。
实现,就是自定义一个协议,定义好方法,然后让别的类实现这个协议和对应的方法,然后将这个类作为实例变量传过来,去调用他对应的方法就是了
代码如下:
- (void)setBoyFriend:(id<BoyFriendProtocol>)boyFriend{
_boyFriend = boyFriend;
}
//需求
- (void) wantEating{
//判断是否实现给定方法
//以后做代理的时候一定要加判断
BOOL re = [[_boyFriend class] instancesRespondToSelector:@selector(cook:)];
if(re){
[_boyFriend cook];
}else{
NSLog(@"play go!!快,play go");
}
}
值得一提的是在上面instancesRespondToSelector:方法。因为这里的方法调用的是通过selector进行搜索的,所有就存在后面传过去的方法名并不存在的可能性。这个时候运行就会报错崩溃。所以才会有上面的方法,作用是判断方法是否存在。