我试着在我的应用程序中使用委托。我的项目使用ARC
例如,我有协议X和其采用的两项对象。 在对象乙我创建的实例为对象甲并设置代表自(A.delegate =自我) 在运行时I调用一个方法回调(在这一点上我的委托对象是乙)。之后,他们都执行-showResult方法。
在什么时候形成了循环参考?我知道这是指定者强的问题,但我不明白它发生了什么时间,以及如何跟踪它。
谢谢!
我试着在我的应用程序中使用委托。我的项目使用ARC
例如,我有协议X和其采用的两项对象。 在对象乙我创建的实例为对象甲并设置代表自(A.delegate =自我) 在运行时I调用一个方法回调(在这一点上我的委托对象是乙)。之后,他们都执行-showResult方法。
在什么时候形成了循环参考?我知道这是指定者强的问题,但我不明白它发生了什么时间,以及如何跟踪它。
谢谢!
如果两个对象都保持对方的强引用(即它们保留对方),那么您的手上可能会有所谓的“保留周期”。这两个对象都不会被释放,因为另一个对象会强烈地引用它(保留它),所以它永远不会放弃它的引用(释放)另一个对象。
这种情况对于代表来说很常见,其中一个对象(称为A)创建另一个对象(B)并将自己设置为B的代表。如果A对B有强烈的引用,那么B不会被解除分配,而B对A也有强烈的引用,那么就有一个参考周期。为了避免这种情况,对象通常不会保留或保留对其代表的强烈引用。让B对弱点的引用不是强而且问题消失。
好的!感谢您的回复!这是一个很好的解释! – 2012-02-16 15:45:57
看起来您在B中对A保持强烈的引用。要么使其成为弱引用,要么 - 这是常见的做法 - 使代表成为弱引用。在后一种情况下,您应确保在B解除分配之前将A的delegate
设置为nil
。
感谢您的回复!是的我的认识不正确。我只是想在强弱之间进行追踪。我想知道 - 有哪些不同。我知道弱点。 – 2012-02-16 15:39:27
一般而言,您应该使委托属性“weak”而不是“strong”来帮助避免保留周期。 – UIAdam 2012-02-16 15:30:27
感谢您的回复!是的,我知道它,但是在哪一刻我能看到形成了一个循环参考?我想说我想知道它是如何跟踪的?我知道我的认识不正确。 – 2012-02-16 15:34:50