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的协议protocolJavainterface接口一样,支持多重继承,在定义protocol协议时最好让其继承NSObject协议,否则无法使用respondsToSelector方法。

Delegate

一句话描述:代理方遵从了某种协议实现了一些功能,被赋予了一些能力。 被代理方(也叫委托方)将这部分功能,在由自己控制的合适时机,交给代理方执行。

场景

实现不同页面间的数据交互,可以用在页面跳转,界面传值,跳转页面刷新数据以及监听事件等等,当delegate的事件触发时,delegate才会被调用。

使用delegation的通用步骤:
  1. 首先要创建一个delegate对象,使用protocol协议定义需要委托的方法接口
  2. 然后委托者要在自身文件里要声明一个delegate对象  @property (nonatomic, weak) id<代理协议> delegate;
  3. 代理方准守协议并实现代理方法(即协议里声明的方法);
  4. 设置代理:被代理方对象名.delegate = 代理方对象名;
  5. 当被代理方需要代理方做事情的时候,用self.delegate调用代理方法,通知代理方干活;
  6. 代理方对象执行代理方法。
使用delegate的几个注意点:
  • 声明的delegate对象的属性要使用weak,用来防止循环引用,因为对象的delegate持有对象本身。
  • 要检查@option方法有没有实现,使用 respondToselector: 来判断
  • 命名最好以delegate的类名开头,然后加上should,will,did
    (委托方法通常包括3种动词:should、will、did
    should表示一个动作发生前,通常带有返回值,可以在动作发生之前改变对象状态。
    will在动作发生前,委托可以对动作做出响应,但不带有返回值。
    did在动作发生后做出的响应。)

 

 

 

 

posted @ 2022-03-11 16:48  Clovran-Wong  阅读(205)  评论(0编辑  收藏  举报