跳至主要內容

Delegation

Fuyuyu大约 3 分钟学习日记Objective-C基础学习

这篇文章摘自OC编程苹果原文的超链接,由于是个弹窗所以贴不了网址

Delegation 委托机制

【这段GPT翻译的时候,把delegating objectdelegate 翻译成“委托对象”和“委托”了,而在实际作用上,称之为“发出委托的对象”和“被委托以任务的对象”或许比较合适,但是拗口又不方便阅读,所以笔者认为英文的动作语态能更好地表达原义,这部分就不做翻译了】

Delegation是程序中的一个简单而强大的模式,在这个模式下,在程序中的一个对象会代表(on be half of)或者协调(in coordination with)另一个对象。delegating object保持对另一个对象(即 delegate )的引用(reference),并在适当的时候向其发送消息。该消息(一个事件的委托)通知delegate ,说明接下来它将要去处理或已处理的事件。delegate 可以通过更新其自身或应用程序中的其他对象的外观或状态来响应该消息,并在某些情况下,它可以返回一个影响即将发生的事件的处理方式的值委托的主要价值在于它允许您轻松地自定义一个中心对象中的多个对象的行为。、

Delegation and the Cocoa Frameworks 委托和Cocoa框架

delegating object 通常是框架对象,而 delegate 通常是控制器controller对象。在托管managed内存环境中,delegating object 维护对其 delegate弱引用;在垃圾回收环境中,接收器receiver维护对其 delegate的强引用。【这里也涉及到了消息机制,接收器其实就是OC类】在Foundation、UIKit、AppKit和其他Cocoa和Cocoa Touch框架中,Delegation的示例比比皆是。

一个关于delegating object 的示例——AppKit框架中的NSWindow类的实例

  • NSWindow声明了一个协议protocol,协议中有一个方法叫做windowShouldClose:。当用户单击窗口中的关闭按钮时,窗口对象向其 delegate发送windowShouldClose:消息以请求确认窗口的关闭。delegate返回一个布尔值,从而控制窗口对象的行为。
  • 下图表示了框架对象向其 delegate发送消息
delegation_2x

Delegation and Notifications 委托和通知

大多数Cocoa框架类的 delegate都会自动注册为delegating object发布的通知notifications观察者【好家伙还涉及到观察者模式】。delegate只需要实现框架类声明的通知方法notifications method,以接收特定的通知消息。如上述的示例,窗口对象会向观察者发布一个NSWindowWillCloseNotification通知,but【这里不知道为什么苹果用了个but,我认为这里不存在转折语意,或许用and会通顺一点】会向其delegate发送windowShouldClose:消息。

Data Source 数据源

数据源与delegate几乎相同。它们的区别在于它们与delegating object的关系。与(delegate)被委托控制用户界面不同,数据源被委托控制数据。通常,delegating object是视图对象,如table view,它保存对其数据源【此处的date source应该单纯指的是数据来源,而非“数据源”这整个概念】的引用,并偶尔向其请求应该显示的数据。数据源【此处则是表达整个概念】则像delegate一样,必须采用一个协议,并实现该协议所需实现的方法。数据源负责管理供给给delegating viewmodel objects的内存。【其实就是数据面的delegate

苹果官方给的参考文献

有时间把我翻译过的给他标注了

Prerequisite Articles

Definitive Discussion

Delegates and Data Sourcesopen in new window

Sample Code Projects