协议
定义
oc的协议有点类似java中的接口,当某个类使用也该协议就必须实现协议中所定义的方法,实际上不定义也不会报错,但会发出警告,在代码运行中如果没有实现协议中的方法,那么就会报错,因为找不到此方法。除此之外协议可以多继承,类似接口的多继承。
可以说协议是一种规范的定义,如果某个类使用了这个协议就需要遵守这份协议(实现协议中的方法)。
关键字
@protocol 协议名 < 父协议名>
//默认中声明的方法也是需要实现的,不然会发出警告
@required //缺省属性,必须要实现
@property (nonatomic,assign)int a;
@optional // 可选实现
@required 缺省属性,被他修饰的方法是必须要实现的;
@optional 可选属性,被他修饰的方法可以不实现
在协议中我们不能声明变量,但是我们可以使用属性的方法:
@property (nonatomic,assign)int a;
在协议遵守方中要实现这个,也是在.h文件中粘贴一些这条语句,系统自动会给我们生产set和get方法。
协议多继承
两种方法
协议名<协议1,协议2 >
类名< 协议1,协议2 >
代理
代理模式是实现两个对象之间的交互的一种机制。在代理模式中涉及到两个对象,一个是主动方一个是被动方。
主动方:拟定协议,创建一个携带协议的 id 指针(指向某个具体的代理);
被动方:遵守协议,实现协议的方法。
针对面向对象思想中的协议的作用
类似java中的接口回调,在android中经常使用监听者设计模式实现对某个事件的监听,再通过接口回调实现监听者触发的动作,oc的代理就可以实现这个功能。
还有另一种作用就是,类A他在做某件事时,但在这件事中他有些地方(如: 事件小a)无法自己完成需要有第三方(类B)来完成事件小a,那么类 B就需要实现事件小a,从而使类 A完成这件事。类A与类B 间就存在一种委托关系,或说是代理。
还可以用来做配置,比如类A 是sdk的提供方,那么它使用的是一些默认配置当,类B作为sdk的使用方,在使用类A提供的sdk时遵守类A提供的协议,就可以自定义实现协议规范。
常用做法:
在协议使用方中:添加属性
@property (nonatomic,strong) id<ProtocolTest2> delegate;
在使用协议中的方法可以先进行 SEL判断是否实现了
//例:
if([self.delegate respondsToSelector:@selector(study)])
[self.delegate study];