【Objective-C 篇】 ☞ 9. 协议

协议(Protocol)

1.1 概念

protocol 可以声明一些必须实现的方法和选择实现的方法。

协议就是规则(规范),定义一个协议就相当于制定规则。

  • 协议可能是一个独立的头文件,也可能写在别的类的头文件里。
  • 协议是OC语言中制定规则(规范)的一种语法。(制定协议方便类与类之间进行通信,可以传参数、传数据)
  • 创建协议(TRProtocol.h文件)

    

protocol注意点:

  • protocol就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写方法的实现。
  • 只要父类遵守了某个协议,那么子类也相当于遵守了某个协议
  • OC不支持多继承,但是能够遵守多个协议。

1.2 语法

1.2.1 定义协议(相当于制定规则,格式与定义类一样)

@protocol 协议名 <父协议>

//1.默认是必须实现的方法(默认是:@required

//方法的声明

//2.从此开始的方法可选的

@optional

//可选的方法声明

//3.必须要实现的方法

@required

//必须实现的方法声明

@end

     

1.2.2 遵守协议(相当于遵守规则)

让类遵守协议

  • 一个类可以遵守1个或多个协议
  • 任何类只要遵守了协议,就相当于拥有了协议的所有方法声明

@interface 类名 : 父类名 <协议名称1, 协议名称2, ...>

@end

@implementation 类名

//实现协议中规定的方法(合成setter和getter方法)

@synthesize 属性=实例变量

//实现协议中规定的方法

//..

@end

     

    protocol和继承的区别:

  • 类继承之后默认就拥有父类方法的声明和实现,而类遵守协议只拥有方法的声明没有实现
  • 相同类型的类(is a 关系)可以使用继承,但是不同类型的类只能使用protocol
  • protocol可以用于存储方法的声明,可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可

1.2.3 协议的相关语法规定

1)协议中规定的属性和方法都是公开的。

一个类一旦遵守了这个协议,就相当于给外界公开了这些访问接口。

2)协议可以继承协议(即协议可以遵守协议),协议的继承相当于将两个协议合并。

    

3)协议支持多继承,一个协议可以同时继承多个协议。(合并多个,协议中只有属性和方法的声明)

    

     4)一个类同时也可以遵守多个协议。

    

1.3 协议的应用场景

一、类型限定:

    (1)可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议

     

    (2)协议经常与id类型结合使用

id p; //id定义的引用变量,可以指向任何类型的对象

id <协议名> p; //用协议可以给id类型的变量做一个限制

此时,p就只能指向遵守了指定协议的对象。(不能指向任何对象,受到了限制,这样更安全了)

  • 以前,我们可以用 id 来定义属性,定义方法的参数,定义方法的返回值类型。
  • 现在,我们可以用id<协议>的形式来定义属性,定义方法的参数,定义方法的返回值类型等。
  • 这种协议的使用会出现在方法的参数,或方法的返回值上,或类的属性定义中。通过这种引用访问属性或调用方法时,编译器会做类型检查,可以避免很多调用错误。

二、代理设计模式

设计模式,可以简单理解为 能够高效完成某一件事的一种规律。

代理可以帮助一个对象完成某一些操作

代理设计模式的应用场景:

  1. 当对象A发生了一些行为,想通知对象B(让对象B成为对象A的代理对象)
  2. 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
  3. 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

 

代理设计模式的作用:

1.A对象监听B对象的一些行为,A成为B的代理

2.B对象想告诉A对象一些事情,A成为B的代理

3.对象B请对象A完成某些行为,A成为B的代理

代理设计模式的总结:

如果你想监听别人的一些行为,那么你就要成为别人的代理

如果你想告诉别人一些事情,那么就让别人成为你的代理

代理设计模式的开发步骤

  • 1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)
  • 2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
  • 3.在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
  • 4.设置代理:xxx.delegate = yyy;
  • 5.yyy对象遵守协议,实现代理方法

 

代理和通知的区别:

  代理:1个对象只能告诉另一个对象发生了什么事

  通知:1个对象可以告诉N个对象发生了什么事

  • KVC(Key Value Coding)常见作用:给模型属性赋值
  • KVO(Key Value Observing)常用作用:监听模型属性值的改变

  

只能一对一创建使用

一.代理协议解决对象间通信的关键:判断谁是代理对象,谁是被代理对象。

判断方法:

(1)谁产生事件,谁就是被代理对象;

(2)谁响应事件,谁就是代理对象。

例如:小孩饿了,需要母亲喂饭。饿了要吃饭这一事件是小孩产生的,母亲收到通知后去喂饭,是响应者,所以小孩是被代理对象,母亲是代理对象。

 

协议+代理 = 委托模式

 

1.4  协议的实际应用

1.4.1 制定规则(规范)

  USB标准规范

  将服务的提供者和服务的使用者分开。可以分工明确。

1.4.2 委托和代理

  委托: 一个对象(A)委托另一个对象(B)完成一些任务。

  代理: 被委托,一个对象(B)代表另一个对象(A)完成一些任务。

  委托方和代理方: 对象A委托对象B完成一些任务,对象A就是委托方,对象B就是被委托方(也叫代理方)

 

  你要租房, 找中介:

  你委托中介给你找房子。你是委托方,中介是被委托方(代理)

1.4.3 具体实现

  委托方:UIAlertView

    1. 定义一个委托协议让被委托方(代理方)去遵守

    2. 定义一个委托属性对象,用于以后指向被委托对象

    3. 在需要调用方法的地方调用被委托对象(代理对象)的方法

  被委托方(代理方):TRWechat

    1. 遵守委托协议 

    2. 实现协议中规定的方法

    3. 将自己设置成委托方的被委托(代理)对象

 

打开API文档:

右键==>显示包内容==>Contents==>Resources==>Documents==>navigation==>index.html文件右键==>Safari浏览器

 

posted @ 2017-03-08 15:26  专注·精彩  阅读(421)  评论(0编辑  收藏  举报