• OC语言--协议


    1.协议的介绍

    1.1什么是协议

    协议就是需要相互遵守的约定、规范。比如卖身协议,我们负责给Boss写代码,调bug,发布,Boss负责给我们发薪水,保险,福利;比如Http协议,两台计算机,遵守相同的约定,可以相互通讯。就像我们彼此交流,都遵守说中文这个约定或规范。

    2. OC中协议

    2.1OC协议概念

    OC或IOS中的协议,就是一组方法(成员函数)的声明列表;声明方不需要实现这些方法,由遵守协议的对象来实现协议所规定的方法。(制定法律规范,让别人遵守).

    2.2OC协议的使用步骤

    制定协议 -> 遵守协议 -> 实现协议里的方法 -> 调用协议里的方法

    2.3 OC协议的制定,协议的声明

    假设招聘的程序员要有能写代码,调bug,汇报工作的能力。(程序员类中要实现的方法)

     协议定义如下:

    @protocol Coder <NSObject>
    
        - (void)code;
    
        - (void)debug;
    
        - (void)report;
    
    @end
    

     

    解释:

    @protocol,是关键字,用于定制协议; 

     Coder,是协议的名字;

    <NSObject>,在IOS里,所有的类,都是直接或间接继承于NSObject类的,所有的协议,都要基于NSObject协议.

    对于NSObject来说,系统中既存在名为NSObject的类, 也存在名为NSObject的协议.            

    - (void)code;

    - (void)debug;

    - (void)report;

    是协议声明的方法,不需要实现,由遵守协议的对象来实现协议制定的方法。

    @end,表示协议声明结束。

    至此,我就制定了一份协议了。

    2.4 遵守协议

    在公司工作,就需要拥有我协议规定的能力(能写代码,调bug等等),也就是说,要需要遵守协议。

    @interface Student : NSObject <Coder>
    
      - (void)eat; 
    
    @end
    

    解释:

    @interface Student : NSObject <Coder>,

    所谓的遵守协议,就是在类的声明后面加上<QFCoder>。

    一个类可以遵守多个协议,在尖括号里,用逗号隔开,例如: <Coder,Player>遵守协议,就需要实现协议所规定的方法。至此,我们遵守协议完成。

    2.5实现协议

    Student类遵守了Coder协议,就要在@implementation里实现Coder中的协议方法。

    @implementation Student
    
    - (void)eat
    
    {
    
        NSLog(@"自定义方法:这是你的益达");
    
    }
    
     
    
    - (void)code
    
    {
    
        NSLog(@"协议所规定的方法:code");
    
    }
    
     
    
    - (void)debug
    
    {
    
        NSLog(@"协议所规定的方法:debug");
    
    }
    
     
    
    - (void)report
    
    {
    
        NSLog(@"协议所规定的方法:进度正常");
    
    }
    
      @end
    

     

     解释:

      - (void)eat

    {

        NSLog(@"自定义方法:这是你的益达");

    }

    这是自己类定义的方法,我们自然要实现

      - (void)code

    {

        NSLog(@"协议所规定的方法:code");

    }

    这是我们遵守Coder协议,我们在这里实现Coder协议的方法。至此,协议实现完成。

    2.6 调用协议方法

    Student *daNa = [[Student alloc] init];

            [daNa eat];

            [daNa code];

            [daNa debug];

            [daNa report];

    2.7 协议中的关键字

    @required:表示必须实现的方法

    @optional:表示可以实现,也可以不是实现的方法,也即可选方法

    尝试将@implementation里的code方法相关内容注释掉,Xcode会产生Method ‘code’in protocol not implemented 警告,即code方法没有实现。

    如果将code,debug,report方法都注释掉,会产生三条警告。因此,如果我们在协议声明里,什么都不写默认是required,也就是必须要实现的。

    将协议声明改为如下形式:

    @protocol Coder <NSObject>
    
    @optional
    
    - (void)code;
    
    - (void)debug;
    
    - (void)report;
    
    @end
    

    警告都没有了,也就是code,debug,report是可选实现了。

    将协议声明改为如下形式:

    @protocol Coder <NSObject>
    
    @optional
    
    - (void)code;
    
    @required
    
    - (void)debug;
    
    - (void)report;
    
    @end
    

    会产生两条警告,也就是code是可选实现,debug,report必须实现。

    2.8 协议方法的调用

    因为协议方法未必全都实现,如果贸然调用一个对象遵守的协议方法,而恰巧这个对象并没有实现的时候,会造成程序的崩溃;因此,我们需要小心的调用协议方法

    我们使用如下形式:

    // 判断 daNa对象,能否响应report方法。
    
    //即,有没有实现report方法,
    
    //如果实现,返回YES,否则返回NO
    
     
    
    if ([daNa respondsToSelector:@selector(report)]) {
    
                    [daNa report];
    
                // 或者可以写成如下这样,performSelector执行方法
    
                // [daNa performSelector:@selector(report)];
    
            }
    
     
    
    if ([daNa respondsToSelector:@selector(familiarWithDatabase)]) {
    
                    [daNa performSelector:@selector(familiarWithDatabase)];
    
            }
    

    从程序的运行结果来看,report我们实现了,因此会打印协议所规定的方法:进度一切正常。familiarWithDatabase并没有实现,则不会被调用到。

    拓展:

    NSCoding协议

    我们在学习归档的时候,要实现encode和decode两个方法,其实是因为我们需要遵守NSCoding协议。只有遵守NSCoding协议的类的对象,才能进行归档操作。

    @protocol NSCoding
    
      - (void)encodeWithCoder:(NSCoder *)aCoder;
    
      - (id)initWithCoder:(NSCoder *)aDecoder;
    
    @end
    
  • 相关阅读:
    Eclipse Mac OS 安装 Subversion插件subclipse 缺失JavaHL解决方案
    Eclipse Mac OS 安装 最新版 Subversion插件subclipse
    mac OS 安装 Homebrew软件包管理器
    Ribbon 框架简介及搭建
    Ribbon 框架简介及搭建
    TinyMCE下载及使用
    努力啊。
    逃离
    怎么学习
    烂代码
  • 原文地址:https://www.cnblogs.com/sublimter/p/4162832.html
Copyright © 2020-2023  润新知