Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C和iOS中,学员似乎可以朝任何方向前进?_Objective C_Ios_Design Patterns_Delegates_Delegation - Fatal编程技术网

在Objective-C和iOS中,学员似乎可以朝任何方向前进?

在Objective-C和iOS中,学员似乎可以朝任何方向前进?,objective-c,ios,design-patterns,delegates,delegation,Objective C,Ios,Design Patterns,Delegates,Delegation,起初我有点惊讶,UIView的绘图得到了CALayer的帮助,但是CALayer的委托实际上是UIView。这种关系似乎颠倒了 但这是真的吗,代表并没有“总指挥官”或“所有权”关系。。。它可以向任何方向移动:例如,类A可以有一个类B的委托,同时,类B也可以有一个类A的委托 更重要的是,可以有多个委托,这意味着一个对象需要其他几个对象的帮助 这有点类似于现实世界,CTO可以将“面试某人的技术能力测试”委托给David,而现在David是一名提供1到10分的代表。但是David可以将满足或不满足的需

起初我有点惊讶,
UIView
的绘图得到了
CALayer
的帮助,但是
CALayer
的委托实际上是
UIView
。这种关系似乎颠倒了

但这是真的吗,代表并没有“总指挥官”或“所有权”关系。。。它可以向任何方向移动:例如,类A可以有一个类B的委托,同时,类B也可以有一个类A的委托

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

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


因此,在Objective-C(可能还有任何语言)中,可以有多个委托,它们可以向任何方向移动,其主要思想只是寻求一些原始对象不知道如何处理的“帮助”。这是真的吗?

委托帮助实现面向对象的封装原则。以UIC应用程序为例。你有没有对它进行过分类?在某些罕见的情况下,这是可能的,但大多数情况下,它提供的重要功能可能会受到用户不小心的子类化的影响。因此,委托模式出现了。UIApplication将完全按照其内部预期的方式运行,并从委托人那里获得某些预期会持续发生的预定义情况的提示。委托的另一个功能与事件(obj-c中的通知)相关。对象将通知其委托外部观察者可能感兴趣的某些事件(例如,UIScrollView开始和结束滚动)

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


所以在你的例子中,CTO有一套标准,他在没有通知David的情况下在内部使用,但对于其中一个标准,他需要David(或其他人)执行一些任务并报告结果。这个结果可能是可选的(David有机会拒绝,CTO将使用自己的判断),也可能是必需的(如果David拒绝,他将失去他的“工作”)。在这两种情况下,重点都是不需要关心CTO内部的想法(就像不需要担心UIApplication是如何做的一样)。重要的功能由开发人员封装

是的,委托可以向任何方向进行,因为作为某个对象的委托实际上只意味着它将代表“main”类执行某些方法

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

因此,在Objective-C(可能还有任何语言)中,可以 多个代表,他们可以向任何方向前进,他们的主要思想 只是为了一些原始对象不知道如何使用的“帮助” 手柄这是真的吗

几乎,这取决于课程和目的,如下所示:

@可选方法

如果被覆盖,但实际上没有必要,或者它们已经有了默认实现,那么这些将有助于自定义方法的行为

@必要的方法


这些都是至关重要的,正如你所说,主类不知道如何处理它们。

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

委托的作用是监视它所委托对象的状态,并在必要时提供有关对象应如何执行其任务的说明。你说得对,没有具体的所有权,比如A类可以是B类的委托,而B类是A类的委托。这很好

委托方法有四种主要类型,它们既向委托提供有关对象状态的信息,又向委托请求指令。佩洛在他的回答中很好地描述了他们


所有这些都是一种迂回的方式来表示是的,你是正确的。

真正建立代理模式的不是语言,而是框架(Cocoa)

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

协议没有实现,也没有绑定到类层次结构,非常适合于委托及其委托者之间存在的松散关系。任何类都可以采用任何协议,或许多协议,声明它将实现其中声明的方法。如果协议概述了委托人和委托人之间的接口,那么该类本身就是委托人

任何对象(而不是类)可以(通常)用作委托的原因是委托属性/IVAR通常是键入的
id
。这是通用对象指针,允许分配任何类型的对象,这与委托的模式一致——委托人需要知道的是,其委托响应它将发送的消息。任何其他行为都不关它的事