------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
一.协议介绍
1.协议的作用就是用来声明方法的,它的内容就是一份方法声明。
2.协议的用途:主要用在设计模式中:代理模式、观察者模式(和代理模式类似,设计思想不同)
二.定义协议
协议一般单独定义在协议名.h文件中。
1.语法格式
<span style="font-size:18px;">#import "其他协议名.h"
// 定义一个协议
@protocol 协议名称 <其他协议名称>
// 零个到多个方法声明...
// @required
// @optional
@end</span>
2.语法说明:
1>定义协议使用@protocol关键字
2>协议名与类名采取相同的命名规范。
3>协议中定义的方法只有方法声明,没有方法实现,且定义在@protocol和@end之间。
4>“<>”是遵守其他协议的语法,可以选择遵守一个或多个协议,也可以不遵守其他协议。建议每个新协议都遵守NSObject协议(基协议)。
5>如果遵守其他协议,需要在文件中包含该协议的头文件。
3.关键字@required、@optional
1>我们通过添加关键字@required、@optional来类遵守了协议后,是否必须实现协议中的方法。
2>@required:位于该关键字之后声明的方法,遵守该协议的类必须在类实现中提供方法的实现,否则编译会发出警告。@required是默认行为。
3>@optional:位于该关键字之后声明的方法,遵守该协议的类不要求必须提供方法的实现,否则编译会发出警告。
4>该关键字的使用主要用于程序员之间的交流。
4.协议可用定义在单独.h文件中,也可用定义在某个类中。
1> 如果这个协议只用在某个类中,应该把协议定义在该类中。
2> 如果这个协议用在很多类中,就应该定义在单独文件中。
三.遵守协议
1.类遵守协议
1>一个类如果遵守了一份协议,那么它就相当于拥有了协议中的所有方法声明。一个类可以遵守多个协议。
1)在定义类的接口部分时可指定该类遵守的协议。
2)只要父类遵守了某个协议,就相当于子类也遵守了。
2>语法格式:
#import "协议名称1.h"
#import "协议名称2.h"
@interface 类名 : 父类名 <协议名称1,协议名称2>
@end
3>语法说明:
1)文件中要包含协议的头文件。
2)多个协议之间用逗号隔开
4>注意
1)一个类如果遵守了一个协议,那么在类的实现部分需要提供对应方法声明的方法实现。
2.协议遵守协议
1>一个协议可以遵守其他多个协议,就相当于拥有了其他协议中声明的方法。在定义协议的时候可指定该协议遵守的协议。
2>语法格式:
#import "其他协议名称1.h"
#import "其他协议名称2.h"
@protocol 协议名称 <其他协议名称1,其他协议名称2>
// 零个到多个方法声明...
@end
3>语法说明
1)要包含所遵守协议的头文件。
4>基协议
1)NSObject协议,是最根本、最基本的协议,称为基协议。(Foundation.h)
2)基协议中声明了很多最基本的方法,比如description、retain、release等。
3)建议每个新的协议都遵守NSObject协议。
4)NSObject类遵守了基协议。
四.使用协议定义变量
1.通过使用协议定义变量,要求某个对象的类型必须遵守协议,从而限制传入对象。
2.通常使用如下两种语法
1>NSObject<协议1,协议2...> *变量;
2>id<协议1,协议2...> *变量;
3>通过这两种方式定义的变量,它们的编译时类型仅仅只是所遵守的协议类型,因此只能调用该协议中定义的方法。
3.定义一个变量的时候,限制这个变量保存的对象必须遵守某个协议,如果没有遵守对应的协议,编译器会警告。
程序示例:
<span style="font-size:18px;">// 要求变量obj保存的对象是NSObject类型,并且要遵守NSCopying协议
NSObject<NSCopying> *obj;
// 要求变量obj2保存的对象可以是任意OC对象类型,并且要遵守NSCoding协议
id<NSCoding> obj2;</span>