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;
  }

在实际开发中协议代理的作用:传值(反向)和回调.下篇文章中细说.

 

时间: 2024-10-31 17:37:54

iOS 协议 protocol的相关文章

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

IOS阶段学习第19天笔记(协议-Protocol)

IOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者      之间通讯的一种方式 2)声明一个协议@protocol协议的名字<基协议> 一个协议可以遵守另一个协议:      基协议(这个协议就拥有了基协议中所有方法的声明) 3)协议中不能声明成员变量,只能有方法声明. 4)协议中声明方法,默认是required 表明方法是必须要实现的,否则会有系统警告,但不会报错 5)协议中@

协议Protocol

1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口. 遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议. 遵守这个协议的类可以实现协议中的方法. 关键字: @required:声明必须遵守的方法 @optional:声明可选的方法 2.代理:实现协议的某个方法 3.委托:指定要实现协议方法的对象(代理),代理来实现对应的方法 总结: 委托方:1.定义协议:2.引用代理:3.发送消息 代理方:1.遵守协议:2.实现方法:3.设置自己为

协议protocol和代理delegate的使用

这里的协议是独立的,不再类里面,所以每个类的头文件都要引入#import "MarryProtoco.h"头文件.. 首先新建一个协议 Protocol:MarryProtoco 里面写代理人要执行的方法,或者可选方法 #import <Foundation/Foundation.h> @protocol MarryProtoco <NSObject> //代理人中必须要执行的 . //做饭 - (void)cook; //洗衣服 - (void)washClo

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使

协议(Protocol)与委托代理(Delegate)

协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情,目的是为了降低对象间的耦合度:或用来逆向传值. 一.定义一套公用接口 1 /** 协议 */ 2 @protocol ExecuteProtocol <NSObject> 3 4 @required 5 /** 6 * @brief 必须实现的某个方法 7 */ 8 - (NSUInteger)q

Objective-C中的协议(Protocol)和类别(Category)

1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承. 协议包括正式协议和非正式协议. 正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现.子类会继承其父类采用的协议,一个协议本身也可以

swift协议_010-swift协议protocol

//: Playground - noun: a place where people can play import UIKit //-----协议-------// //协议:声明一组属性和方法,由协议的签订者来实现协议方法. //1.协议的声明 protocol WXHLProtocol { //声明一组方法 func doHomework() func dontLate() //3.Swift的协议中可以声明属性 var money : Int {set get} var classNu

12-Objective-C特有语法:协议protocol

1.协议是用来干嘛的? 用来声明一堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守那个协议 2.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 3.如何遵守协议 1> 类遵守协议 @interface 类名 : 父类名 <协议名称1, 协议名称2> ······ @end 2> 协议遵守协议 @protocol 协议名称 <其