你好!
我尝试在我的应用程序中使用委托。我的项目使用ARC。
例如,我有协议X和两个使用它的对象。 在对象B中,我创建了一个对象A的实例,并将delegate设置为自己(A.delegate = self)。 运行时我调用一个回调方法callBack(此时我的delegate对象是B)。然后它们都执行-showResult方法。
何时形成循环引用?我知道这是strong关键字的问题,但我不明白它发生的时间,以及如何追踪它。
谢谢!
你好!
我尝试在我的应用程序中使用委托。我的项目使用ARC。
例如,我有协议X和两个使用它的对象。 在对象B中,我创建了一个对象A的实例,并将delegate设置为自己(A.delegate = self)。 运行时我调用一个回调方法callBack(此时我的delegate对象是B)。然后它们都执行-showResult方法。
何时形成循环引用?我知道这是strong关键字的问题,但我不明白它发生的时间,以及如何追踪它。
谢谢!
如果两个对象互相保持强引用(即彼此保留对方),则可能会出现“保留循环”问题。由于对方保留了它(强引用),因此任何一个对象都不会被释放,也不会释放对另一个对象的引用。
这种情况在委托中很常见,其中一个对象(称其为A)创建另一个对象(B)并将自己设置为B的委托。如果A对B有强引用,以便B不会被释放,并且B也对A有强引用,则会产生引用循环。为了避免这种情况,通常不要保留或保持强引用到它们的代表。将B对A的引用改为弱引用,而不是强引用,问题就解决了。
看起来你在B中对A保持了强引用。要么将其改为弱引用,要么按照常规做法将委托设置为弱引用。在后一种情况下,在B被释放之前,应确保将A的delegate
设置为nil
。
weak
而不是strong
。 - UIAdam