协议是多个类共享方法的列表,协议中列出的方法在本类中并没有相应的实现,而是由别的类实现的这些方法。一个类要遵守一个协议,该类就必须实现特定协议的所有方法(可选方法除外)。协议是一系列方法的列表,任何类都可以声明自身实现了某一个或一些协议。
定义一个协议需要使用 @protocol 指令,紧跟着是协议的名称,然后就可以声明一些方法,在指令 @end 之前的所有方法的声明都是协议的一部分。下面是在 NSObject.h 上所定义的 NSCopying 协议的代码:
1 @protocol NSCopying
2
3 - (id) copyWithZone:(NSZone *) zone;
4
5 @end
如果你的类决定遵守 NSCopying 协议,则必须实现 copyWithZone:方法。通过在@interface 中的一对尖括号内列出协议的名称,告诉编译器你正在遵守一个协议,比如:@interface Test:NSObject <NSObject> 这句代码的意思是:Test 类的父类是NSObject,并且遵守了 NSCopying 协议。
如果想遵守多个协议,只需要在尖括号中列出多个协议,并可用“ ,”隔开。比如:@interface Test: NSObject <NSCopying , NSCoding> 。
你也可以自己定义协议,比如:
1 @protocol Fly
2
3 - (void)go;
4 - (void)stop;
5 @optional // 可选的方法,可实现也可不实现
6 - (void)sleep;
7
8 @end
下面就通过一个例子,来具体说明下协议的用法:
1 #import <Foundation/Foundation.h>
2
3 @protocol Study
4
5 - (void)study;
6 - (void)stop;
7
8 @optional // 可选的方法,此程序中选择不实现
9 - (void)sleep;
10
11 @end
12
13 @interface Test : NSObject <Study>{
14
15 }
16 - (void)study;
17 - (void)stop;
18 @end
19
20 @implementation Test
21
22 - (void)study{
23 NSLog(@"好好学习,天天向上!");
24 }
25
26 - (void)stop{
27 NSLog(@"不学习,将很难成功!");
28 }
29 @end
30
31 int main(int argc , const char *argv[]){
32 @autoreleasepool {
33 Test *test = [Test new];
34
35 [test study];
36 [test stop];
37
38 if([test conformsToProtocol:@protocol(Study)] == YES) // 判断是否遵守了协议
39 NSLog(@"遵守了Study协议!");
40 else
41 NSLog(@"没有遵守协议!");
42 }
43 return 0;
44 }
同时,在创建一个新协议的时候,也可以在原有的协议上面扩展,如:@protocol Study1 <Study>。
接下来说明一下协议定义的标准语法,其格式为:
@optional 表明符合该协议的类并不一定要实现方法声明中的各个方法,@required 是必须要实现的方法。协议类类似一个公共接口,它规定了多个类之间的接口。