Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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 委托引用其作为委托的对象是否是一种不良做法?_Objective C_Design Patterns_Oop_Delegates - Fatal编程技术网

Objective c 委托引用其作为委托的对象是否是一种不良做法?

Objective c 委托引用其作为委托的对象是否是一种不良做法?,objective-c,design-patterns,oop,delegates,Objective C,Design Patterns,Oop,Delegates,我正在为我的一个对象使用委托模式。我的想法是,我将能够在以后将该代表换成执行不同策略的不同代表。我想这和委托模式一样是策略模式 我的问题是,我的委托将引用返回到它作为委托的对象是否是一种不好的做法?无论使用哪种委托/策略,我都需要访问该对象的一些属性。如果这是一个糟糕的表单,我应该如何访问属性?不一定。例如,一个“控制器”类型的对象创建数据对象和视图并使自己成为其中一些对象的委托以正确控制事物是很常见的。我想说是的,这是不好的做法。委托背后的思想是,它实际上是一个独立的对象,接收关于它作为委托的

我正在为我的一个对象使用委托模式。我的想法是,我将能够在以后将该代表换成执行不同策略的不同代表。我想这和委托模式一样是策略模式


我的问题是,我的委托将引用返回到它作为委托的对象是否是一种不好的做法?无论使用哪种委托/策略,我都需要访问该对象的一些属性。如果这是一个糟糕的表单,我应该如何访问属性?

不一定。例如,一个“控制器”类型的对象创建数据对象和视图并使自己成为其中一些对象的委托以正确控制事物是很常见的。

我想说是的,这是不好的做法。委托背后的思想是,它实际上是一个独立的对象,接收关于它作为委托的对象(“委托者”)的消息。委托人应该有对委托人的引用,而不是相反,否则它就不再是真正的委托关系了

完成请求的首选方法是提供发送对象以及您的代理收到的任何消息。例如,在代理上,您可以删除
delegator
属性并发送消息
delegator:(id)另一个对象,而不是使用
delegator
属性然后接收
didDoSomething:(id)另一个对象。这样,可以使委托与委托人保持不同,但在需要时仍然可以访问委托人的属性

这种方式还有一个优点,就是当您不真正需要委托人时,不提供方法中的委托人访问权;例如,您的委托可以有一个
didDoSomething
方法,该方法不带参数,甚至不带delegator,只用于日志记录,还可以有一个
delegator:(id)一个对象didSomethingElse:(id)另一个对象
方法,该方法调用delegator上的一些属性,并且涉及的内容更多

最后,此方法允许您对多个委托人使用同一委托,因为您不需要为每个委托对象更新
delegator
属性


关于如何工作的一个很好的例子,请看一下文档,特别是它的委托方法-其中许多方法的形式为
connection:didDoSomething:
,其中第一个参数是调用委托者的连接。开发人员通常为多个连接定义一个连接委托,根据传入的NSURLConnection对象的属性实现其委托方法以执行不同的操作。

通常,依赖项不应该有对依赖对象的引用,因为这是一个经典的循环引用。为了避免反向引用,可以在委托方法中提供所需的属性作为参数,或者将属性本身移动到委托中

这根本不是坏习惯。委托模式允许类有一种通用的方式与任意数量的对象进行通信,只要类实现相同的协议。但设置委托的类通常也会有一些公共属性或方法,允许您查询或更改该类正在执行的操作,作为响应,该类可能会触发许多委托调用。因此,您需要一个您作为委托对象的类的引用,以便告诉对象做一些与它已经做的不同的事情,当然,在您完成它时释放它

这也是为什么始终将任何代理属性作为赋值而不是保留属性很重要的原因。这样,当原始类被释放时,它实际上将被释放,而不是拥有它所持有的委托对象,从而导致一个保持这两个对象的retain循环


这也是为什么每当你被释放时,你应该在任何你可能有委托引用集的地方把委托引用设置为nil。这样,如果在使用委托的类之前释放委托,则该类将不会有无效的委托引用。

我不知道您为什么被否决,但我喜欢您的答案。感谢您对NSURLConnection的透彻解释和指针。您的帖子似乎假设委托类是围绕委托人将有一个引用的假设而设计的。没有理由这样。例如,在非绑定项目中,控制器引用一个表视图,同时也是该表视图的委托,实现正常的委托方法是很常见的。使用NSURLConnection,作为实现者,您总是在外部跟踪NSURLConnections(一个或多个)。如果没有其他原因,您可以这样做,以便在外力需要时可以优雅地取消连接(屏幕锁定或内存警告可能是一些很好的例子)。API传回所使用的连接,不是为了让您不需要保留引用,而是因为对单个委托类使用多个NSURL连接是典型的,这是区分哪个连接响应的唯一方法。我也有点被否决投票弄糊涂了。当然,将委派对象作为参数传递给委派方法是UIKit中的常见模式,AppKit-UITableView执行此操作,NSURLConnection执行此操作,各种UIControl子类执行此操作。。。如果没有指示请求委托的对象,则不能将同一对象用作多个客户端的委托,这是通常的做法。@马克:没有人反对将self传递给委托方法的想法。每个人都同意你应该那样做。反对票是指一名控制员