2012-02-16 64 views
4

您好!目标-c中使用委托的ARC循环引用

我试着在我的应用程序中使用委托。我的项目使用ARC

enter image description here

例如,我有协议X​​和其采用的两项对象。 在对象我创建的实例为对象并设置代表自(A.delegate =自我) 在运行时I调用一个方法回调(在这一点上我的委托对象是)。之后,他们都执行-showResult方法。

在什么时候形成了循环参考?我知道这是指定者的问题,但我不明白它发生了什么时间,以及如何跟踪它。

谢谢!

+1

一般而言,您应该使委托属性“weak”而不是“strong”来帮助避免保留周期。 – UIAdam 2012-02-16 15:30:27

+0

感谢您的回复!是的,我知道它,但是在哪一刻我能看到形成了一个循环参考?我想说我想知道它是如何跟踪的?我知道我的认识不正确。 – 2012-02-16 15:34:50

回答

13

如果两个对象都保持对方的强引用(即它们保留对方),那么您的手上可能会有所谓的“保留周期”。这两个对象都不会被释放,因为另一个对象会强烈地引用它(保留它),所以它永远不会放弃它的引用(释放)另一个对象。

这种情况对于代表来说很常见,其中一个对象(称为A)创建另一个对象(B)并将自己设置为B的代表。如果A对B有强烈的引用,那么B不会被解除分配,而B对A也有强烈的引用,那么就有一个参考周期。为了避免这种情况,对象通常不会保留或保留对其代表的强烈引用。让B对弱点的引用不是强而且问题消失。

+0

好的!感谢您的回复!这是一个很好的解释! – 2012-02-16 15:45:57

1

看起来您在B中对A保持强烈的引用。要么使其成为弱引用,要么 - 这是常见的做法 - 使代表成为弱引用。在后一种情况下,您应确保在B解除分配之前将A的delegate设置为nil

+0

感谢您的回复!是的我的认识不正确。我只是想在强弱之间进行追踪。我想知道 - 有哪些不同。我知道弱点。 – 2012-02-16 15:39:27