首页 文章

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

提问于
浏览
58

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

@property (nonatomic,weak) id delegate;

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

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

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

4 回答

  • 86

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

  • 2

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

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

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

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

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

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

  • 24

    这是为了避免保留周期 . Apple提供有关advanced memory management的信息指南,解释情况以及如何最好地处理它 . 在ARC中,它们现在被称为强参考循环,在_1724554中对此进行了解释 .

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

    @property (nonatomic, assign) id delegate;
    

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

    @property (nonatomic, unsafe_unretained) id delegate;
    

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

    @property (nonatomic, weak) id <MyObjectDelegate> delegate;
    

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

  • 18

    作为一种常见做法,如果我们有两个对象彼此保持引用,我们将"child"对象作为弱引用 .
    对于iOS中的委派模式,委托对象是父对象,因为没有委托对象就不需要委托调用者 . 例如,您有一个句子对象,其中包含方法sentenceShouldEnd的委托对象 . 段落对象是句子对象的委托对象 . 显然段落对象实际上是父对象,在你的句子对象中你应该将你的委托作为弱引用 .
    在你的观点,你将代表分配给自己,你的理解是错误的 . 我们永远不应该委托给自己 . 如果您觉得有必要聘请代理商为您购买机票,为什么还要自己购票?你说的是两个完全不同的概念 . 当你将一个委托对象定义为属性时,它会在B)中说出来,那么很可能你会将A.delegate分配给self,这是真实的B.你在这里看到了亲子关系?您在B中为A分配内存 . 在B中保存A.如果没有B,则不存在 . 您没有分配代理到了!!!

相关问题