OC--protocol 协议

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)一起使用。很好的了解协议,能够帮助我们在后面学习和使用代理。


猜你喜欢

转载自blog.csdn.net/m0_37681833/article/details/61917720