Objective-C中ARC循环引用使用委托

5

你好!

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

enter image description here

例如,我有协议X和两个使用它的对象。 在对象B中,我创建了一个对象A的实例,并将delegate设置为自己(A.delegate = self)。 运行时我调用一个回调方法callBack(此时我的delegate对象是B)。然后它们都执行-showResult方法。

何时形成循环引用?我知道这是strong关键字的问题,但我不明白它发生的时间,以及如何追踪它。

谢谢!


1
一般来说,为了避免循环引用,你应该将委托属性设置为 weak 而不是 strong - UIAdam
谢谢回复!是的,我知道这个问题,但是在什么时候我能看到形成了循环引用?我的意思是我想知道它是如何跟踪的?我知道我的实现不正确。 - Matrosov Oleksandr
2个回答

14

如果两个对象互相保持强引用(即彼此保留对方),则可能会出现“保留循环”问题。由于对方保留了它(强引用),因此任何一个对象都不会被释放,也不会释放对另一个对象的引用。

这种情况在委托中很常见,其中一个对象(称其为A)创建另一个对象(B)并将自己设置为B的委托。如果A对B有强引用,以便B不会被释放,并且B也对A有强引用,则会产生引用循环。为了避免这种情况,通常不要保留或保持强引用到它们的代表。将B对A的引用改为弱引用,而不是强引用,问题就解决了。


1

看起来你在B中对A保持了强引用。要么将其改为弱引用,要么按照常规做法将委托设置为弱引用。在后一种情况下,在B被释放之前,应确保将A的delegate设置为nil


谢谢回复!是的,我的实现不正确。我只想追踪强引用和弱引用之间的区别。我想知道它们之间的差异。我了解弱引用。 - Matrosov Oleksandr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接