在OC程序中经常会有这样的问题就是一个类想让其他类帮自己实现某些方法,然后再将结果返回给这个类;如何让一个类要找的代理去实现自己想要的方法呢?
这样就需要有一个协议,让能遵守协议的其他类都能实现协议中的方法声明,成为该类的代理。
protocol的使用原则:
1.可以用来声明很多方法,但是不能声明成员变量。
2.只要一个类遵守了这个协议,就相当于拥有了这个协议中所有的方法声明,然后在自己的.m文件中实现就行了。
3.只要父类遵守了这个协议,就相当于子类也遵守了这个协议。
protocol的使用方法:
一、协议的定义
@protocol 协议名<NSObject>
//方法声明
@end
二、如何遵守协议
1.类遵守协议
@interface 类名:父类名<协议1,协议2,……>
@end
2.协议遵守协议
@protocol 协议名 <协议1,协议2,……>
@end
三、协议中方法声明的关键字
1.@required(默认),这个是默认要求去实现的,不实现会有警告。
2.@optional这个是可以先实现也可以选择不实现。
一般情况下这两个关键字是用于程序员之间的交流,声明哪些方法可以不实现哪些方法要去实现。
四、在定义一个变量时,可以限制这个变量保存的对象遵守某个协议
类名<协议名>*变量名; 如Person<protocol1>*p=[[Person alloc]init]; 要求p保存的对象Person必须遵守protocol1协议。
id<协议名>变量名; 如id<protocol1>obj;
五、@property中声明的属性也可以做一个遵守协议的限制。
@property (nonatomic ,strong) 类名<协议名>变量名; 如@property (nonatomic,strong) Person<protocol1>*p1;
六、协议不仅可以定义在单独的.h文件中也可以定义在一个类的声明中。
即若协议内容公用就要定义在单独的.h文件中方便使用。
七、协议的提前声明
和类的提前声明“@class 类名”的方式类似,协议的提前声明可以用“@protocol 协议名”的方式进行提前声明,些声明只是纯粹性的声明,若需要协议中的方法还需要用
#import "协议头文件"方式获取其中的方法声明。
如:@protocol Myprotocol; #import "Myprotocol.h"
关于protocol 理论知道我只学了这么多,日后的学习中再进行补充吧。
http://www.itheima.com/