2

起初我有点惊讶的是,UIView我的绘图是由帮助的CALayer,但CALayer代表实际上是UIView。似乎关系颠倒了。

但是,delegate 是否真的没有“主帅”或“所有权”关系……它可以去任何方向:例如,A 类可以有一个 B 类的委托,同时 B 类可以还有一个代表是 A 类。

更重要的是,可以有多个委托,这意味着一个对象需要几个其他对象的帮助。

这有点类似于物理世界,CTO 可以将“面试某人的技术能力测试”委托给 David,而现在 David 是提供 1 到 10 分的代表。但 David 可以委托满足或不要回到 CTO(一个布尔值)说“我只能面试 Javascript 的候选人,我同意可以雇用新候选人并同意与他合作,如果你发现他擅长可扩展性问题,因为我们的团队需要这样一个人”——David 将其委托给 CTO。

所以在Objective-C(也可能是任何语言)中,可以有多个委托,他们可以去任何方向,主要思想只是为了一些原始对象不知道如何处理的“帮助”。真的吗?

4

5 回答 5

2

iOS 中的代表与现实生活中的不同。委托不会主动告诉对象如何工作,而是被动地指示对象应该如何操作,并接收有关对象状态的更新。

委托用于监视其所委托的对象的状态,并提供有关对象应如何执行其任务的说明(必要时)。您有权说没有特定的所有权,例如 A 类可以成为 B 类的代表,而 B 类委托 A 类。这很好。

有四种主要类型的委托方法,它们都向委托提供有关对象状态的信息,并从委托中请求指令。Peylow 在这里的回答中很好地描述了它们。

所有这一切都是一种迂回的说法,是的,你是对的。

于 2012-05-29T01:11:30.393 回答
1

代表有助于面向对象的封装原则。以 UIApplication 为例。你有没有对它进行子类化?在一些罕见的情况下是可能的,但大多数时候它提供的重要功能可能会受到用户粗心的子类化的影响。于是,委托模式就出现了。UIApplication 将完全按照其内部预期的方式运行,并从委托中获取某些预定义情况的提示,这些情况预计会始终如一地发生。委托的另一个功能与事件有关(obj-c 中的通知)。该对象将通知其委托外部观察者可能感兴趣的某些事件(例如,UIScrollView 开始和结束滚动)。

但是,通常只有一个代表,而不是您所说的多个代表。这并不是说这是不可能的,但大多数时候这是不寻常的(如果两个代表将单元格高度提供给 UITableView 会发生什么?)

因此,在您的示例中,CTO 有一组标准,他在内部使用而不通知大卫,但对于其中一个标准,他需要大卫(或他自己以外的人)执行某些任务并报告结果。这个结果可能是可选的(大卫有机会拒绝,CTO 将使用他自己的判断)或必需的(如果大卫拒绝,他将失去他的“工作”)。无论哪种情况,关键是无需关心 CTO 内部的想法(就像无需担心 UIApplication 如何做它所做的那样)。重要的功能是从开发人员那里封装的。

于 2012-05-29T01:09:44.443 回答
1

是的,代表可以朝任何方向前进,因为作为某事的代表实际上只意味着它将代表“主”类执行某些方法。

这可能与您提出的问题有关:

Objective C 中的多个委托

所以在Objective-C(也可能是任何语言)中,可以有多个委托,他们可以去任何方向,主要思想只是为了一些原始对象不知道如何处理的“帮助”。真的吗?

几乎,它取决于类和这样的目的:

@可选方法

这些将有助于自定义方法的行为,如果被覆盖但不是真正必要的,或者它们已经有默认实现。

@required 方法

这些至关重要,正如您所说,主要课程不知道如何处理它们。

于 2012-05-29T01:10:47.517 回答
1

实际上,建立委托模式的不是语言,而是框架(Cocoa)。

然而,委托通常使用称为“协议”的语言特性来实现。ObjC 中的协议是一个类可以承诺实现的方法声明列表。协议中的每个方法都可以是可选的或必需的。如果一个类采用了协议但没有实现所需的方法,编译器将发出错误信号。

协议没有实现并且不依赖于类层次结构,非常适合存在于委托与其委托者之间的松散关系。任何类都可以采用任何协议,或许多,宣布它将实现那里声明的方法。如果协议概述了委托人和委托人之间的接口,那么该类实际上就是委托人。

任何对象(而不是class)可以(通常)用作委托的原因是委托属性/ivars 通常是 typed id。这是通用对象指针,允许分配任何类型的对象,这与委托的模式保持一致——委托者需要知道的只是它的委托响应它将发送的消息。任何其他行为与其业务无关。

A类可以有一个B类的委托,同时B类也可以有一个A类的委托。

当然,可能,只要他们每个人都知道对方实现了必要的方法。在我的脑海中,我想不出这样做的理由——Cocoa 中的委托通常是控制器对象,允许在没有子类化的情况下修改框架模型类的行为。委托人/模型将请求其委托人/控制器允许做某事,或通知委托人它即将或刚刚做某事。

所以在Objective-C(也可能是任何语言)中,可以有多个委托,他们可以去任何方向,主要思想只是为了一些原始对象不知道如何处理的“帮助”。真的吗?

我真的不知道你所说的“去任何方向”是什么意思。这也不是什么“帮助”。一般来说,具有关联委托协议的对象不需要委托存在——没有它它也能很好地工作。

于 2012-05-29T01:12:13.973 回答
0

委托只是一种提供函数的方法,您正在调用您希望它使用的数据和算法的访问权限。这没有什么神奇之处,也没有涉及“标准”——只是一种利用普通对象的特殊方式。其他语言对同一概念使用不同的术语(例如,“事件处理程序”)。

于 2012-05-29T01:15:30.080 回答