iOS 協議 protocol


iOS中的協議說白了就是方法的聲明,只聲明不需要實現,實現的部分由遵守協議方完成.

先看個協議的小例子:這個例子是先給出兩個協議,再創建兩類人遵守協議.

流氓協議(RogueDelegate.h)

 #import <Foundation/Foundation.h>
  /**流氓協議*/
  @protocol RogueDelegate <NSObject>
  @required // 必須實現的方法
  /**吃*/
  - (void) eat;
  /**騙*/
  - (void) lie;
  @optional // 可選實現的方法
  - (void) drink;
  @end

君子協議(GentleDelegate.h)

  /**君子協議*/
  @protocol GentleDelegate <NSObject>
  // 協議內容只能有方法不能有屬性
  // 協議方法
  /**動口不動手*/
  - (void) fight;
  /**愛錢取之有道*/
  - (void) loveMoney;
  @end

遵守協議的對象

  #import <Foundation/Foundation.h>
  #import "RogueDelegate.h"
  #import "GentleDelegate.h"

  // 遵守協議的類就是代理類; 如果一個類遵守了協議, 就要去實現協議方法;
  /**遵守流氓協議的代理*/
  // 一個類可以同時遵守多個協議, 在一個<>中多個協議名用逗號隔開
  @interface YHPerson : NSObject <RogueDelegate, GentleDelegate>

  @end

  @interface YHStudent : NSObject <RogueDelegate>

  - (void) study;

  @end

實現協議

  #import "YHPerson.h"

  @implementation YHPerson
  - (void) eat {
      NSLog(@"正在吃霸王餐!!");
  }
  - (void) lie {
      NSLog(@"在撒謊!!");
  }
  - (void) fight {
      NSLog(@"動口不動手!!");
  }
  - (void) loveMoney {
       NSLog(@"愛錢取之有道!!");
  }
  @end
  @implementation YHStudent
  // 實現學生相關的方法
  - (void) study {
      NSLog(@"Good Good Study, Day Day Up.");
  }
  // 實現流氓協議的方法
  - (void) eat {
      NSLog(@"吃完帶搶");
  }
  - (void) lie {
      NSLog(@"處處留情!!");
  }
  @end

協議中的概念

  委托:就是委托別人干事的一方,指定協議的一方

  代理:接受委托的一方;具體做事的,實現協議的一方

  協議:代理方做事的守則,也就是代理方需要實現方法的申明

協議的特點:1.一個類可以遵守多個協議(就好像一個公司可以為多家公司服務一樣)

       2.同一個協議可以被多個類遵守(就好像一個公司可以由多個公司提供服務一樣)  

一個類遵守了什么協議,就要實現這個協議規定的方法

下面在各以各具體的事例:老板想要做一個iOS項目,但是自己不會做, 找一個會iOS開發的人來幫他做

在YHBoss.h文里聲明協議,聲明委托屬性,並實現委托代理方法

 

  #import <Foundation/Foundation.h>
  //2.協議
  /**聲明協議*/
  @protocol StaffDelegate <NSObject>
  /**會IOS開發(做開發)*/
  - (void) codeIOS;
  @end
  // 1. 委托
  // 委托需要一個遵守協議的對象來幫他做事情 (委托需要一個代理)
  /**委托類(制定協議)*/
  @interface YHBoss : NSObject
  // 任何遵守協議的類創建的對象都可以作為老板的代理
  // 注意: delegate要用weak修飾(防止循環引用造成對象不能銷毀)
  /**代理*/
  @property (nonatomic, weak) id <StaffDelegate> delegate;
  // 委托代理方法(告訴代理何時去做事情)
  /**告訴代理*/
  - (void) askStaffWorking;
  @end

 

在YHBoss.m文件里實現委托代理方法

  #import "YHBoss.h"

  @implementation YHBoss
  //委托告訴代理做事
  - (void) askStaffWorking {
       NSLog(@"老板告訴員工開工");
       // 代理開始做事情
      [self.delegate codeIOS];
  }
  @end

在員工YHPerson.h文件里遵守協議

  #import <Foundation/Foundation.h>
  #import "YHBoss.h"

  // 3.代理(遵守協議, 實現協議方法)
  /**代理*/
  @interface YHPerson : NSObject <StaffDelegate>
  @end

在員工YHPerson.m文件里實現代理方法

 #import "YHPerson.h"
  #import "YHBoss.h"

  @implementation YHPerson
  // 判斷一個對象是否實現了某個方法
  // (這里判斷self.delegate是否實現了buyPhone方法)
  if ([self.delegate respondsToSelector:@selector(codeIOS)]) {
      // 代理開始做事情
      [self.delegate codeIOS];
  }
  @end

在main.文件中創建boss對象和員工對象,讓員工對象成為老板對象的代理在老板要求員工工作的時候,員工實現協議中的方法

  #import <Foundation/Foundation.h>
  #import "YHPerson.h"

  int main(int argc, const char * argv[]) {
      @autoreleasepool {
          // 1.首先需要一個boss
          YHBoss *boss = [[YHBoss alloc] init];
          // 2.需要一個員工
          YHPerson *person = [[YHPerson alloc] init];
          // 3.讓員工成為老板的代理
          boss.delegate = person;
          // 4.老板喊開工
          [boss askStaffWorking];
      }
      return 0;
  }

在實際開發中協議代理的作用:傳值(反向)和回調.下篇文章中細說.

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM