为什么使用弱指针进行授权?

我不明白为什么用弱指针定义委托是正确的:

@property (nonatomic,weak) id delegate; 

我不明白为什么没有必要保留对委托的引用…我不希望我用作委托的对象被释放…因此,我宁愿使用强大的引用而不是弱!

在许多情况下,委托是我的类的实例创build的同一个对象,在这种情况下,创build一个弱引用将是一个很好的解决scheme,以避免保留周期…但如果我select一个完全不同的对象作为委托?

我在堆栈溢出search其他问题,但我找不到可以帮助我完全理解这种情况的东西。

对象弱留留代表的原因是为了避免保留周期。 想象一下以下场景:对象a创buildb并保留它,然后将自己设置为b的委托。 a由其所有者发布,留下包含ab的保留周期。 这实际上是一个非常普遍的情况。 考虑一个视图控制器拥有一个视图,并作为该视图的委托。 在这种情况下,视图不应该保留控制器 – 作为适当的MVC体系结构的主体并防止保留周期。

虽然保留周期是一个有效的关注点,但是一个弱引用的推理更多地与苹果关于如何使用uikit和开箱即用的其他元素来使用委托模式有关:

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

具体来说:“代表团的主要价值在于它允许您轻松地自定义一个中心对象中多个对象的行为。”

如果委托人处理pipe理多个对象的委托任务,那么这些对象不需要保留委托,也不应该承担分配委托的责任,因为委托可能被其他对象使用。 薄弱的参考强调的是委托pipe理不是委托人的责任。

目标c中的一个示例是一个委托用于多个表视图,就像使用表视图和具有uisearchbar的searchdisplay控制器一样。 苹果示例使用控制器作为委托,但是对于主表视图和结果表视图使用一个自定义委托进行search时,推理仍然成立。 该自定义委托可能会由您的控制器保留,以提供给两个表视图。

这与委托人经常由委托人创build的其他语言中引用的基本委托模式根本不同,每个实例可以pipe理自己的委托实例。

这是为了避免保留周期。 苹果公司提供了关于高级内存pipe理的信息指南,解释这种情况以及如何最好地处理这种情况。 在ARC中,它们现在被称为强参考周期,在“ 过渡到ARC版本说明”中进行了说明 。

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

 @property (nonatomic, assign) id delegate; 

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

 @property (nonatomic, unsafe_unretained) id delegate; 

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

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

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

作为一种常见的做法,如果我们有两个相互引用的对象,那么我们将“父子关系”中的“子”对象作为一个弱引用。
对于iOS中的委托模式,委托对象是父代,因为不需要委托调用者不存在委托对象。 例如,对于方法sentenceShouldEnd,您有一个带委托对象的句子对象。 你的段落对象是你的句子对象的委托对象。 显然,段落对象实际上是父对象,而在句子对象中,应该将委托作为一个弱引用。
就你的意思而言,你把委托给自己,你的理解是错误的。 我们不应该把委托给自己。 如果您觉得有必要聘请代理为您购买机票,为什么自己购买机票? 你是在说两个完全不同的概念。 当你将一个委托对象定义为属性的时候,它在它所定义的对象中使用了一个弱引用(可以说A,即委托对象是A的一个属性)。 当你初始化A时(假设在B中),委托被分配,那么你最有可能将A.delegate分配给self,这在实际上是B.你在这里看到的是父子关系? 你在B中为A分配内存。你在B中保存A,A中不存在没有B的情况。你没有把代理赋值给A!