objective-c protocol协议
2018-04-10 本文已影响0人
一世长安乱
作用:声明一些方法
定义
@protocol 协议名称
//方法声明列表
@end
类遵守协议
-
一个类可以遵守一个或者过个协议
-
任何类只要遵守了protocol,就相当于拥有了protocol的所有方法声明
@interface 类名 : 父类 <协议名称1,协议名称2,...> @end
和继承的区别
- 继承之后就默认实现,protocol只有声明
- protocol可以用来储存方法的声明,可以将多个类共同的方法抽取出来
- 相同类型的类可以继承,但是不同类型的类只能用protocol
注意
- 协议只能声明方法,不能声明成员变量
- 子类会遵守父类遵守的协议
- OC中可以遵守多个协议(OC只能单继承,也就是不能继承多个父类)
- OC中的协议可以遵守其他协议,该协议就会自动包含遵守协议的声明
基协议
NSObject是基协议
建议每个新的协议都要遵守NSObject协议,但不遵守也没问题
@required和@optional
- @required:这个方法必须要实现,如果没有关键字修饰协议中的方法,该方法就默认是required。如果没有实现该方法,就会报一个警告,仅用于程序员之间的交流,不会运行错误
- @optional:方法不一定要实现
@protocol protocolName <NSObject>
@required //不实现方法会报警告
- (type)funname;
@optional //不实现不会报警告
- (type)funname;
协议的应用场景
-
将协议写在数据类型右边,明确的标注如果想要给该变量赋值,那么该对象就必须遵守某个协议
数据类型<协议名称> 变量名
//如果没有遵守协议就会报警告
classname<protocolname> *p = [[classname alloc] init];
```
- 注意:虽然在接受某一对象的时候,对这个对象进行了类型限定(限定他必须实现某个协议),但是并不意味着这个对象就真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证
- 代理设计模式:类似于代理网点
- 当A对象想要监听B对象的一些变化时
- 当B对象发生变化,想通知A对象的时候
- 让B对象成为A对象的代理对象,A无法处理一些行为时,B可以
- 一般情况下,协议书与谁,协议就定义在谁的头文件
- 协议名称一般以他属于那个类的类名开头,后面加上protocol或者delegate
- 协议中方法的名称一般以协议的名称protocol之前的作为开头
- 一般情况下协议中的方法会触发协议的对象传递出去
- 一般情况下一个类中的代理的名称叫做 delegate
- 当某一个类要成为另一个类的代理的时候
- 一般情况下在.h用@protocol 协议名称; 告诉当前类这是协议
- 在.m中用#import真正导入一个协议的声明