【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<协议>的形式来定义属性,定义方法的参数,定义方法的返回值类型等。
- 这种协议的使用会出现在方法的参数,或方法的返回值上,或类的属性定义中。通过这种引用访问属性或调用方法时,编译器会做类型检查,可以避免很多调用错误。
二、代理设计模式
设计模式,可以简单理解为 能够高效完成某一件事的一种规律。
代理可以帮助一个对象完成某一些操作
代理设计模式的应用场景:
- 当对象A发生了一些行为,想通知对象B(让对象B成为对象A的代理对象)
- 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
- 当对象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浏览器