协议是多个类共享方法的列表,协议中列出的方法在本类中并没有相应的实现,而是由别的类实现的这些方法。一个类要遵守一个协议,该类就必须实现特定协议的所有方法(可选方法除外)。协议是一系列方法的列表,任何类都可以声明自身实现了某一个或一些协议。
定义一个协议需要使用 @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 是必须要实现的方法。协议类类似一个公共接口,它规定了多个类之间的接口。