为什么使用弱指针进行委派?

Mat*_*oal 59 objective-c

我无法理解为什么用弱指针定义委托是正确的:

@property (nonatomic,weak) id delegate;
Run Code Online (Sandbox Code Playgroud)

我无法意识到为什么没有必要保留对委托的引用...我不希望我用作委托的对象被释放...因此,我宁愿使用强引用而不是弱!

在许多情况下,委托是我的类的实例将被创建的相同对象,在这种情况下,创建弱引用将是避免保留周期的一个很好的解决方案......但是如果我选择一个完全不同的对象作为委托,该怎么办? ?

我搜索了有关堆栈溢出的其他问题,但我找不到可以帮助我完全理解这种情况的东西.

Bar*_*ark 92

对象弱保留其委托的原因是为了避免保留周期.想象一下以下场景:对象a创建b并保留它,然后将自己设置为 b委托.a由其所有者发布,留下包含a和的保留周期b.这实际上是一种非常常见的情况.考虑一个视图控制器,它拥有一个视图并充当该视图的委托.在这种情况下,视图不应该保留控制器 - 作为适当的MVC架构的主要部分并且防止保留周期.

  • @MatterGoal在你问的情况下,确实可能没有必要弱举​​代表.如果您确定第三个对象不会创建保留周期,请确保执行此操作.但拥有这些知识引入了耦合.您通常不会对特定情况进行编码,而是针对一般情况进行编码,在这种情况下,将来证明的最佳做法是弱举代表. (5认同)
  • 谢谢,但它是如何在这样的情况下相关:`A`创建`B`和`B`有委托`C` (2认同)

koc*_*ude 26

虽然保留周期是一个有效的问题,但弱引用的推理更多地与苹果关于如何使用uikit的委托模式和开箱即用的其他元素的观点相关联,这在此处解释:

http://developer.apple.com/library/IOs/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html

具体来说:"委托的主要价值在于它允许您轻松自定义一个中心对象中多个对象的行为."

如果委托处理管理多个对象的委托任务,则这些对象不需要保留委托,也不应承担委托委托的责任,因为它可能被其他对象使用.弱引用强制执行委托管理不是委托人责任的概念.

目标c中的一个示例是一个代表用于多个表视图,例如使用表视图和带有uisearchbar的searchdisplaycontroller时.Apples示例使用控制器作为委托,但是当您为搜索的主表视图和结果表视图使用一个自定义委托时,推理仍然成立.您的控制器可能会保留该自定义委托,以便提供给两个表视图.

这与其他语言中引用的基本委派模式有根本的不同,其中委托通常由委托者创建,每个实例可以管理自己的委托实例.


joh*_*ohn 18

这是为了避免保留周期.Apple提供有关高级内存管理的信息指南,解释了这种情况以及如何最好地处理它.在ARC中,它们现在称为强引用循环,在转换为ARC发行说明中对此进行了解释.

以前你要为这样的委托定义一个属性,

@property (nonatomic, assign) id delegate;
Run Code Online (Sandbox Code Playgroud)

但是在ARC中,你可以这样定义它,

@property (nonatomic, unsafe_unretained) id delegate;
Run Code Online (Sandbox Code Playgroud)

或者,例如,如果您有一个名为的协议<MyObjectDelegate>,您也可以这样定义委托,

@property (nonatomic, weak) id <MyObjectDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

换句话说,如果你有一个协议,在ARC中你可以声明一个委托weak.否则,unsafe_unretained.