zoukankan      html  css  js  c++  java
  • oc语言--protocol(协议)

    一、protocol

    1.基本用途

     1> 可以用来声明很多方法,但是不能用来声明成员变量

     2> 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

     3> 只要父类遵守了某个协议,就相当于子类也遵守了

    2.格式

     1> 协议的编写

     @protocol 协议名称

      //方法声明列表

      - (void)test;

      - (void)test2;

      + (void)test;

      + (void)test2;

     @end

     2> 某个类遵守协议

     @interface 类名 :父类 <协议名称>

     @end

     3> 定义一个变量的时候,限制这个变量保存的对象遵守某个协议

     类名<协议名> 变量名;

     例如:NSObject<协议名1> *obj;//现在obj只能保存遵守协议名1的对象;如果没有遵守编译器会发出严重警告

     4> @property中声明的属性也可用作一个遵守协议的限制

     例如:@property (nonatomic,strong) 类名<协议名称> *属性名;

        @property (nonatomic,strong) Dog<协议名> *dog;

    3.关键字

     协议中有两个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流

     1> @required:这个方法必须要实现(若不实现,编译器会发出警告)

     2> @optional:这个方法不一定要实现

     1 @protocol MyProtocol //声明协议
     2 - (void)test;
     3 + (void)test;
     4 @optional
     5 - (void)test2;
     6 + (void)test2;
     7 @end
     8 
     9 #import <Foundation.Foundation.h>
    10 
    11 @interface Person : NSObject <MyProtocol> //遵守协议
    12 @end
    13 
    14 @implementation
    15 - (void)test
    16 {
    17     //要求实现该方法
    18 }
    19 + (void)test
    20 {
    21     //要求实现该方法
    22 }
    23 
    24 - (void)test2
    25 {
    26     //可以不实现该方法
    27 }
    28 + (void)test2
    29 {
    30     //可以不实现该方法
    31 }
    32 }
    33 @end
    34 
    35 int main()
    36 {
    37     return 0;
    38 }
    协议(例子)

    4.协议遵守协议

     1> 一个协议可以遵守其他多个协议,多个协议之间用逗号,隔开

     2> 一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

     3> 多协议格式

     @protocol 协议名称 <协议1,协议2>

     @end

    5.基协议

     1> NSObject是一个基类,最根本最基本的类,任何其它类最终都要继承他

     2> NSObject也是一个协议,最根本最基本的协议

     3> NSObject协议中声明了很多最基本的方法,例如description、retain、release等

     4> 建议每个新协议都要遵守NSObject协议

    6.注意点

     协议可以定义在单独.h文件中,也可以定义在某个类中

     1> 如果这个协议只用在某个类中,应该把协议定义在该类中

     2> 如果这个协议用在很多类中,就应该定义在单独文件中

     二、协议的应用--代理模式

    1.设计原理

     有些事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做 

    2.设计原则

     1> 首先要拥有某个代理对象属性

     2> 其次要清楚代理有哪些方法

     3> 最后要帮助能解耦

    3.实现方案

     1> 定义一个protocol,在其中声明一些和代理沟通的方法

     2> 拥有一个代理属性 id<protocol>delegate

     3> 让代理遵守protocol

     1 #import <Foundation.Foundation.h>
     2 
     3 @property TicketDelegate <NSObjecct> // 设计协议
     4 - (double)ticketPrice; // 票价
     5 -(int)leftTicketNumber; // 剩余票数
     6 @end
     7 
     8 
     9 @interface Person : NSobject
    10 
    11 @property id<TIcketDelegate> delegate;
    12 
    13 - (void)buyTicket;
    14 
    15 @end
    16 
    17 
    18 
    19 @implementation Person
    20 
    21 - (void)buyTicket
    22 {
    23     //自己没时间去买票,叫代理
    24     double price = [_delegate ticketPrice];
    25     int number = [_delegate leftTicketNumber];
    26     NSLog("通过代理得知,票价=%d,剩余票数为%d", price ,number);
    27 }
    28 @end
    29 
    30 
    31 
    32 
    33 @interface Agent <TicketDelegate> //遵守协议
    34 @end
    35 
    36 
    37 
    38 @implementation Agent : NSObject
    39 - (double)ticketPrice
    40 {
    41     rerurn 100.0;
    42 }
    43 
    44 -(int)leftTicketNumber
    45 {
    46     return 10;
    47 }
    48 @end
    49 
    50 
    51 
    52 int main()
    53 {
    54     Person *p = [Person new]; //
    55     Agent *a = [Agent new]; // 代理
    56 
    57     p.delegate = a; // 设置人的代理
    58     [p buyTicket];
    59 
    60     return 0;
    61 }
    代理(例子)

     三、自我总结

      协议顾名思义就是双方达成的意愿。但是在计算机语言中,有其特有的含义。协议本身包含大量方法的声明,协议的最大用途,我现在的理解是可以实现两个毫无关系的类的沟通,即我们常说的代理模式,协议中有大量的方法声明,只要实现这些方法就可以实现相应的功能,当然前提是要遵守。这块内容很重要,一定要牢牢掌握。

  • 相关阅读:
    epoll 使用详解
    STL 较详尽总结
    可视化对比排序算法
    统治世界的十大算法
    Vector Demo
    Git远程操作(附重要原理图)
    Wireshark(五):TCP窗口与拥塞处理
    Wireshark(四):网络性能排查之TCP重传与重复ACK
    Wireshark(三):应用Wireshark IO图形工具分析数据流
    Wireshark(二):应用Wireshark观察基本网络协议
  • 原文地址:https://www.cnblogs.com/smqh/p/4246661.html
Copyright © 2011-2022 走看看