首页 > 代码库 > 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语言--协议