iphone - 委托(delegate)——他们到底是什么?

标签 iphone objective-c delegates

任何人都可以使用一些现实生活过程的类比来解释它们 - 例如经营棒球队、咖啡店或汽车修理店 - 任何有意义的事情吗? 比如我们甚至不谈 CODE、SYNTAX 或编程——我看过很多这样的帖子,但没有一个真正适合我——我们能先谈谈概念吗?

好像我什至不明白为什么我们有它们,它们有什么优势等等。

向我展示在有和没有委托(delegate)的情况下运行的流程的真实世界类比,这样我就能明白是什么让它们如此有用和伟大。

然后我们就可以编码出来了。

(仅供引用,我特别感兴趣的是 Objective-C/iPhone 应用程序开发实现 - 但我真的认为首先从概念上理解这一点更为重要。)

提前致谢!

最佳答案

并非所有编码抽象都有现实生活中的等价物。例如,您很难找到分页内存的真实类比。因此,我不会做现实生活中的类比,而是要给你一个现实生活中的案例,说明你为什么需要它们。

首先,动词 to delegate 的实际定义(来自牛津词典):

entrust (a task or responsibility) to another person, typically one who is less senior than oneself : he delegates routine tasks | the power delegated to him must never be misused.

委托(delegate)是被委托(delegate)了责任的对象,因为从设计的角度来看,让一个类完成所有工作是没有意义的。

假设您有一个 UI 表类。您想让它可重用以显示多种数据:这意味着,在大多数情况下,您不能将它与模型本身联系起来。例如,如果您将 UI 表专门用于显示 Album 对象(带有名称、艺术家等),那么您将无法重用它来显示 File 对象(带有所有者、文档类型)等):您必须编辑类(class)以使其适合。这会重复很多代码,所以你应该找到另一种机制。这导致了一个问题:如果不允许绑定(bind)到数据类,它如何显示任何类型的数据?

解决方案是拆分获取数据和显示数据的责任。由于您的表需要数据来显示它,但由于它对您的模型一无所知,因此无法自行发现它,因此它应该将此职责委托(delegate)给另一个类,专门为此目的而设计,并交由它处理信息以表格将知道如何使用的一般形式返回。

这意味着您将拥有另一个类,该类将响应表对象将使用的一定数量的方法,就好像它是其核心行为的一部分(例如,委托(delegate)上的一个方法来获取表对象的名称列,另一个获取特定行等)。对于一个具体的例子,你可以查找 NSTableViewDelegate协议(protocol)引用:这些是 NSTableView 可以调用其委托(delegate)以获取有关各种事物或自定义行为的信息的方法。 (tableView: 参数基本上每个方法都标识调用该方法的 TableView 。它经常被忽略,因为存在许多 TableView 委托(delegate)类来支持单个 TableView 。)

委托(delegate)是简单地“知道得更好”的对象。您的 UI 表不知道如何获取它需要的内容,但它有一个“知道得更多”的委托(delegate),因此它可以从中请求数据。

您也可以使用这种模式来处理事件:例如,当一个 View 被点击时,它不知道该做什么,但也许它有一个知道该做什么的委托(delegate)。

换句话说,委托(delegate)是扩展类行为而无需修改类或子类化的几种方法之一。

关于iphone - 委托(delegate)——他们到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6148148/

相关文章:

iphone - 在 iOS4 中,applicationWillEnterForeground 可能会在 applicationDidEnterBackground 之前被调用,这会产生问题

c# - 任何时候访问类属性(获取或设置)时执行的方法?

ios - 来自纹理图集的纹理未加载或出现

ios - 原因 : '-[CNContact setSnapshot:]: unrecognized selector sent to instance 0x7fc84c8491c0'

iPhone - 如何处理多个 UIImagePickerControllerDelegate?

ruby-on-rails - Rails 为什么要使用委托(delegate)?

ios - 在 completionblock 中无法更改 UILabel 文本

ios - 从 UITableViewCell 中删除单元格?

iphone - 隐藏和显示 View

iphone - NSUserDefaults 是否删除暂时不需要的 key ?