zoukankan      html  css  js  c++  java
  • Protocol and Delegate协议和代理

     1.什么是协议?
      OC协议仿照Java的接口。协议和接口,都是不同类的对象之间一种通信的机制。
    2.协议的基础语法
      单纯的语言描述协议的语法,很难让人理解,主要因为在OC中协议是类对象的通信机制,他并不是一个文件所能展现出来的。协议是多文件之间的一种关系,写法不难,重要的是逻辑关系不混乱。
    (1)书写协议,协议体内书写方法,遵从(conform)该协议的类,将会出卖这个方给协议的主人。
    (2)协议的属性
      这里书写的方法也有属性,协议的方法,默认为@required,意为必须,遵从协议的人必须有这个方法。
      属性@option,遵从协议的对象,如果有这个方法就出卖这个方法,若没有就算了。
    (3)协议的遵从
      类遵从协议,只需要包含协议,并且在类声明的@interface最后加<protocol>即可,这里的<>里面是协议名。
    (4)协议的主人
      一个类拥有协议,需要包含这个协议,然后声明一个id<protocol>型的成员变量 ,就说明该类拥有protocol协议,是其主人。
    协议有时不是为了扩大权利,反而是为了限制权利。使用协议,让遵从协议的对象,只拥有有限的方法。
    3.协议的使用(代理和委托)
       协议的使用,关乎多个文件,所以我们这里使用一个小程序来体会,协议的使用。
       一家具厂老板需要一批木材,但是老板不懂采购。厂里的工人懂得采购木头,但是工人不需要采购。这时老板就需要委托工人去购买木头,工人作为老板的代理去采购。使用面向对象的思想,使用OC完成这个程序。

    1. //boss.h
    2. #import <Foundation/Foundation.h> 
    3. #import "work.h" 
    4. @interface Boss : NSObject 
    5. @private 
    6. id <work> delegate;  //id类型变量,表明代理为delegate ,该类为协议的拥有者 
    7.  @property (retain)id <work> delegate;//强引用,不加retain为弱引用 
    8.  -(void)delegateBuyWood;  
    9. @end 
    1. //  Boss.m 
    2.  #import "Boss.h" 
    3.  @implementation Boss 
    4.  @synthesize delegate; 
    5.  -(void)delegateBuyWood 
    6.      [delegate BuyWood];         //协议主人不能直接调用协议中的函数,需要代理 
    7. -(void)dealloc  
    8.     [delegate release]; 
    9.     [super release]; 
    10.  
    11. @end 
    1. //  worker.h 
    2. #import <Foundation/Foundation.h>  
    3. #import "work.h" 
    4. @interface worker : NSObject <work>         //说明类遵循协议  
    5. -(void)BuyWood;  
    6. -(void)married; 
    7. @end
    1. //  worker.m  
    2. #import "worker.h" 
    3. @implementation worker  
    4. -(void)BuyWood  
    5.     NSLog(@"BuyWood!!!");  
    6. }  
    7. -(void)married  
    8.     NSLog(@"Marry!!!");  
    9. @end 
    1. //  work.h 
    2. #import <Foundation/Foundation.h>  
    3. @protocol work <NSObject> 
    4. -(void)BuyWood;  //这是worker类出卖的方法,这样能够被主人调用 
    5. @end 
    1. //  main.m 
    2. #import <Foundation/Foundation.h> 
    3. #import "Boss.h" 
    4. #import "worker.h" 
    5.  
    6. int main (int argc, const char * argv[]) 
    7.     @autoreleasepool { 
    8.         Boss * jianjian = [[Boss alloc]init]; 
    9.         worker * dandan = [[worker alloc]init]; 
    10.         jianjian.delegate = dandan;            //将worker对象设为boss的代理 
    11.         [jianjian delegateBuyWood];          //这样boss就能买木头了 
    12.         [jianjian release]; 
    13.         [dandan release];
    14.     } 
    15.     return 0; 

     4.代理和回馈
       上面的函数完成了我们初步的设计,但是我们会发现,如果要是boss类中的成员有木材总量的话,每次work购买木头,boss中的木材总量都会增加。解决这个问题的话,再添加一个代理,boss遵循这个协议,worker拥有这个协议,就能完成两个类之间的通讯。我们也可以叫这种方式叫做回馈。
       当两个对象互为代理的时候,我们在设置代理的set函数时,需要将其中任意一个retain,另一个不retain。使用retain设置的对象set函数,我们称之对该对象的强引用,不使用retain设置的对象,称之为若引用。

    5.函数的声明

    凡是父类已经声明过的函数,子类重写时,不用再声明,而且不管子类是否声明,只要main文件里有父类的头文件,那么该函数就是公有的。

    凡是出卖给协议的方法,可以只在协议里写声明,类里面不需要声明。只要main函数能找到该函数的一个声明,该函数就是公有的,称该函数对main可见。

    本文出自 “CoderToDeveloper” 博客,请务必保留此出处http://rongchengfei.blog.51cto.com/6269699/1089601

  • 相关阅读:
    数据挖掘竞赛常用代码段
    东南大学《算法设计基础》课程作业 4
    东南大学《算法设计基础》课程作业 3
    东南大学《算法设计基础》课程作业 2
    东南大学《算法设计基础》课程作业 1
    shiro
    你好2021!
    关系型数据库索引设计与优化
    lua table面向对象扩展
    lua、python对比学习
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/4999562.html
Copyright © 2011-2022 走看看