zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/sublimter/p/4162832.html
Copyright © 2011-2022 走看看