protocol:协议,就是定义声明了一组方法,让其他类去实现。当然,想要实现这些类,就必须要遵守这个协议。协议没有父类,也没有实例变量
协议是一种特殊的程序设计结构,专门用来声明别的类实现的方法。它有一下常用场景:
1、需要由别的类实现的方法。
2、声明未知类的接口。
3、两个类之间的通信。
协议会有这几种常用场景,是因为它的特点:协议的方法可以被任何遵守该协议的类实现。
协议并不是一个类,他只是定义声明了一些其他类可以实现的方法(接口)。
语法:
@protocol ZKProtocol <NSObject>
//协议方法声明
@end
NSObject是所有协议的基协议。 @protocol 声明协议的关键字。ZKProtocol:协议名称。
类遵守协议,那么这个类在默认情况下就拥有了协议的所有方法。
协议方法分为两种:@optional:可选实现方法 @required:必须实现的方法
@protocol ZKProtocol <NSObject>
@optional
//可选实现方法
- (void)doSomeThings;
@required
//必须实现的方法
- (void)printWords;
@end
当我们把协议写好以后,那么久需要一个类来遵守协议,实现协议方法。
.h文件中遵守协议:
#import "ZKProtocol.h"
@interface ZKTest : NSObject<ZKProtocol>
- (void)showPrint;
@end
<ZKProtocol>:遵守协议的标志。
.m文件中实现协议方法:
#import "ZKTest.h"
@implementation ZKTest
//ZKTest类自己的方法
- (void)showPrint{
NSLog(@"test类的方法打印");
}
#pragma ZKProtocal协议的可实现方法
- (void)doSomeThings{
NSLog(@"do someThings");
}
#pragma ZKProtocal协议必须实现方法
- (void)printWords{
NSLog(@"Hello Words!!");
}
@end
在main文件中调用:
#import <Foundation/Foundation.h>
#import "ZKProtocol.h"
#import "ZKTest.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象
ZKTest *test = [[ZKTest alloc]init];
//调用方法
[test showPrint];
//判断协议方法是否被实现
if ([test respondsToSelector:@selector(printWords)]) {
//调用协议方法
[test printWords];
}
if ([test respondsToSelector:@selector(doSomeThings)]) {
[test doSomeThings];
}
}
return 0;
}
打印结果:2017-03-13 16:02:59.148 OCdemo[1795:184583] test类的方法打印
2017-03-13 16:02:59.149 OCdemo[1795:184583] Hello Words!!
2017-03-13 16:02:59.149 OCdemo[1795:184583] do someThings
Program ended with exit code: 0
从上面的代码来看,我们在调用协议方法的时候,是使用遵守协议的类创建的对象然后再调用方法。这就说明了这些协议方法在类遵守了协议以后,类也就拥有了这些协议方法。在使用之前要判断协议方法是否被实现。
协议在开发中是常使用到的一种设计结构,而且常与代理(delegate)一起使用。很好的了解协议,能够帮助我们在后面学习和使用代理。