MacOS: 消息传递机制
消息传递机制
- 目标-动作对(target-action):当某个事件发生时,向指定对象发送特定消息。target指的是对象,action通过消息选择器(selector)选择。
- 辅助对象(helper objects):使用协议的方式,当事件发生时,向遵守响应协议的辅助对象发送消息。(协议类似于Java中的接口类,定义了接口方法,让其他类去实现)。
- 通知(notification):苹果公司提供的方法,通知中心(notification center)对象。程序员向通知中心告知当某个特定事件发生时,向指定的对象发送特定消息。
- Block对象:Block是一段可执行代码,在事件发生时,执行这段代码。Block类似于匿名函数或者lambda,允许程序员将调用的代码和需要回调的代码写到一起,方便阅读。
- KVO :
target-action
Target-Action主要被用于响应用户界面事件时所需要传递的消息中。iOS中的UIControl和Mac中的NSControl/NSCell都支持这种机制。Target-Action在消息的发送者和接收者之间建立了一个非常松散耦合。消息的接收者不知道发送者,甚至消息的发送者不需要预先知道消息的接收者。如果target是nil,action会在响应链(responder chain)中被传递,直到找到某个能够响应该aciton的对象。场景:
Target-Action 用的最明显的一个地方就是button(按钮)。button除了需要发送一个click事件以外,并不需要再发送别的信息了。所以Target-Action在用户界面事件传递过程中,是最佳的选择。
优缺点:
发送的消息不能携带自定义的payload。无法一对多使用,限定了target。但是特别方便
辅助对象
delegate 和 protocol 区别通俗易懂: https://blog.csdn.net/u012078168/article/details/72871334
Protocol
协议,在OC中可以理解为接口的声明集合。 遵从某一种协议,即为可以实现该协议所声明的接口。协议有requested必要方法,和option可选方法两种,协议提供编程接口,给调用者实现协议中的方法。
OC
的类与Java
的类一样,不支持多重继承,只支持单继承,OC
的协议protocol
与Java
的interface
接口一样,支持多重继承,在定义protocol
协议时最好让其继承NSObject
协议,否则无法使用respondsToSelector
方法。
Delegate
一句话描述:代理方遵从了某种协议实现了一些功能,被赋予了一些能力。 被代理方(也叫委托方)将这部分功能,在由自己控制的合适时机,交给代理方执行。
场景:
实现不同页面间的数据交互,可以用在页面跳转,界面传值,跳转页面刷新数据以及监听事件等等,当delegate的事件触发时,delegate才会被调用。
使用delegation的通用步骤:
- 首先要创建一个delegate对象,使用protocol协议定义需要委托的方法接口
- 然后委托者要在自身文件里要声明一个delegate对象 @property (nonatomic, weak) id<代理协议> delegate;
- 代理方准守协议并实现代理方法(即协议里声明的方法);
- 设置代理:被代理方对象名.delegate = 代理方对象名;
- 当被代理方需要代理方做事情的时候,用self.delegate调用代理方法,通知代理方干活;
- 代理方对象执行代理方法。
使用delegate的几个注意点:
- 声明的delegate对象的属性要使用weak,用来防止循环引用,因为对象的delegate持有对象本身。
- 要检查@option方法有没有实现,使用 respondToselector: 来判断
- 命名最好以delegate的类名开头,然后加上should,will,did
(委托方法通常包括3种动词:should、will、did
should表示一个动作发生前,通常带有返回值,可以在动作发生之前改变对象状态。
will在动作发生前,委托可以对动作做出响应,但不带有返回值。
did在动作发生后做出的响应。)