• Objective-c 协议(Protocol)


      协议是多个类共享方法的列表,协议中列出的方法在本类中并没有相应的实现,而是由别的类实现的这些方法。一个类要遵守一个协议,该类就必须实现特定协议的所有方法(可选方法除外)。协议是一系列方法的列表,任何类都可以声明自身实现了某一个或一些协议。

      定义一个协议需要使用 @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 是必须要实现的方法。协议类类似一个公共接口,它规定了多个类之间的接口。

  • 相关阅读:
    PHP之十六个魔术方法详解
    PHP之十六个魔术方法详解
    让Docker容器使用静态独立的外部IP(便于集群组建)
    桥接和nat模式区别
    使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
    docker gitlab
    docker gitlab安装
    docker ui管理工具
    docker 批量删除容器
    Scrapy设置代理
  • 原文地址:https://www.cnblogs.com/xiaozhai-1234/p/5242698.html
Copyright © 2020-2023  润新知