2013-07-02 124 views
-1

我在UINavigationController中有两个UIViewControllers。
viewControllerA是viewControllerB的委托。
显然,viewControllerA没有对viewControllerB的引用。
viewControllerB具有对viewControllerA的引用,因为vcA是vcB的委托。
为什么委托引用很弱?

我被告知代表参考应该很弱。
就我而言,我不认为这是真的。
如果UINavigationController将决定放弃vcA,则vcB的委托将为零。
但是,如果对vcA的引用很强烈,vcB仍然会引用它。

那么为什么代表们很弱?
是的,我知道它之前已被问过。是的,我花了很多时间试图理解这一点。 但我似乎并不了解这一点。

谢谢。

+1

因为如果一个对象X设置本身作为对象Y的代表,那么很可能是X具有很强的裁判Y和如果Y有一个X(其代表)也一样,这将导致保留周期。 – 2013-07-02 18:31:31

+0

我认为vcA是'rootViewController'并且vcB被推到最上面? –

+0

@意义 - 事情正是如此。 –

回答

0

在我看来,代表应该弱(或分配在非ARC代码)以避免循环。

一个典型的情况下,我们在许多样品中看到的,是:

_myViewController = [[MyViewController alloc] init]; 
_myViewController.delegate = self; 

这将产生一个循环,如果代表是强的,因为_myViewController由原始对象,而这又是通过_myViewController参考引用。

+0

你可以从你的答案中删除'在我看来',这是代表应该是'弱/分配'的唯一原因。 ;)) – danypata

+0

对委托的强引用也有很好的理由,参见'NSURLConnection'。 –

+0

@MartinR:虽然它们都被称为“委托”,但在我看来,NSURLConnection在其短期生命周期内完成实际工作所需的临时保留对象与视图控制器的委托有点不同。 – Chuck

0

我认为当B类提供一个委托给A类时.A类将为这个委托分配一个强大的委托,现在如果B类也使这个委托强壮,这将导致内存泄漏。由于这两个阶级都强烈地提到这个代表,所以只有当这个代表变得虚弱而另外一代人失去记忆时,它才能被释放。

Good Link

相关问题