首页 > 代码库 > OC语言--协议
OC语言--协议
1.协议的介绍
1.1什么是协议
协议就是需要相互遵守的约定、规范。比如卖身协议,我们负责给Boss写代码,调bug,发布,Boss负责给我们发薪水,保险,福利;比如Http协议,两台计算机,遵守相同的约定,可以相互通讯。就像我们彼此交流,都遵守说中文这个约定或规范。
2. OC中协议
2.1OC协议概念
OC或IOS中的协议,就是一组方法(成员函数)的声明列表;声明方不需要实现这些方法,由遵守协议的对象来实现协议所规定的方法。(制定法律规范,让别人遵守).
2.2OC协议的使用步骤
制定协议 -> 遵守协议 -> 实现协议里的方法 -> 调用协议里的方法
2.3 OC协议的制定,协议的声明
假设招聘的程序员要有能写代码,调bug,汇报工作的能力。(程序员类中要实现的方法)
协议定义如下:
@protocol Coder <NSObject> - (void)code; - (void)debug; - (void)report;@end
解释:
@protocol,是关键字,用于定制协议;
Coder,是协议的名字;
<NSObject>,在IOS里,所有的类,都是直接或间接继承于NSObject类的,所有的协议,都要基于NSObject协议.
对于NSObject来说,系统中既存在名为NSObject的类, 也存在名为NSObject的协议.
- (void)code;
- (void)debug;
- (void)report;
是协议声明的方法,不需要实现,由遵守协议的对象来实现协议制定的方法。
@end,表示协议声明结束。
至此,我就制定了一份协议了。
2.4 遵守协议
在公司工作,就需要拥有我协议规定的能力(能写代码,调bug等等),也就是说,要需要遵守协议。
@interface Student : NSObject <Coder> - (void)eat; @end
解释:
@interface Student : NSObject <Coder>,
所谓的遵守协议,就是在类的声明后面加上<QFCoder>。
一个类可以遵守多个协议,在尖括号里,用逗号隔开,例如: <Coder,Player>遵守协议,就需要实现协议所规定的方法。至此,我们遵守协议完成。
2.5实现协议
Student类遵守了Coder协议,就要在@implementation里实现Coder中的协议方法。
@implementation Student- (void)eat{ NSLog(@"自定义方法:这是你的益达");} - (void)code{ NSLog(@"协议所规定的方法:code");} - (void)debug{ NSLog(@"协议所规定的方法:debug");} - (void)report{ NSLog(@"协议所规定的方法:进度正常");} @end
解释:
- (void)eat
{
NSLog(@"自定义方法:这是你的益达");
}
这是自己类定义的方法,我们自然要实现
- (void)code
{
NSLog(@"协议所规定的方法:code");
}
这是我们遵守Coder协议,我们在这里实现Coder协议的方法。至此,协议实现完成。
2.6 调用协议方法
Student *daNa = [[Student alloc] init];
[daNa eat];
[daNa code];
[daNa debug];
[daNa report];
2.7 协议中的关键字
@required:表示必须实现的方法
@optional:表示可以实现,也可以不是实现的方法,也即可选方法
尝试将@implementation里的code方法相关内容注释掉,Xcode会产生Method ‘code’in protocol not implemented 警告,即code方法没有实现。
如果将code,debug,report方法都注释掉,会产生三条警告。因此,如果我们在协议声明里,什么都不写默认是required,也就是必须要实现的。
将协议声明改为如下形式:
@protocol Coder <NSObject>@optional- (void)code;- (void)debug;- (void)report;@end
警告都没有了,也就是code,debug,report是可选实现了。
将协议声明改为如下形式:
@protocol Coder <NSObject>@optional- (void)code;@required- (void)debug;- (void)report;@end
会产生两条警告,也就是code是可选实现,debug,report必须实现。
2.8 协议方法的调用
因为协议方法未必全都实现,如果贸然调用一个对象遵守的协议方法,而恰巧这个对象并没有实现的时候,会造成程序的崩溃;因此,我们需要小心的调用协议方法
我们使用如下形式:
// 判断 daNa对象,能否响应report方法。//即,有没有实现report方法,//如果实现,返回YES,否则返回NO if ([daNa respondsToSelector:@selector(report)]) { [daNa report]; // 或者可以写成如下这样,performSelector执行方法 // [daNa performSelector:@selector(report)]; } if ([daNa respondsToSelector:@selector(familiarWithDatabase)]) { [daNa performSelector:@selector(familiarWithDatabase)]; }
从程序的运行结果来看,report我们实现了,因此会打印协议所规定的方法:进度一切正常。familiarWithDatabase并没有实现,则不会被调用到。
拓展:
NSCoding协议
我们在学习归档的时候,要实现encode和decode两个方法,其实是因为我们需要遵守NSCoding协议。只有遵守NSCoding协议的类的对象,才能进行归档操作。
@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder;@end
OC语言--协议