gpt4 book ai didi

ios - 为什么 weak/strong dance 解决了这个 strong reference cycle?我不明白

转载 作者:行者123 更新时间:2023-11-29 01:05:54 24 4
gpt4 key购买 nike

好吧,强弱舞的道理我明白了。

一个例子是,假设 B 强引用一个 block ,我们在 B 中设置该 block 以强引用自身 (B)。我们现在有 B 强引用我们的 block ,也许我们的 block 被分配到堆中以便稍后运行(也许是异步的),并且我们的 block 强引用 B。假设只有某个对象 A 强引用 B。如果我们杀死 A,那么 B -> block AND block -> B. 强引用循环和内存泄漏。

我们可能看到的另一种方式是 A 强引用 B。B 强引用 C。也许 C 具有 block 属性,而 B 表示 C.block = ^{ self.blah = blah }。现在我们有 B 强引用 C,C 强引用 B。A 被杀死,我们再次有一个强引用循环。如果我在这方面有任何错误,请纠正我。

现在我看到了一个在我看来不应该是强引用循环的强引用循环。

我有一个类,我们称它为 A。A 有一个函数 fooBar。在 fooBar 内部,我们调用

[[MySingleton sharedInstance] doSomeBackgroundJazz: ^{
self.blah = blah;
}];

我们看到一个强大的引用循环,并且 A 没有被释放。现在,在我看来,A 没有对 MySingleton 的强引用。也许在 fooBar 期间它会这样做,但类本身不会。但是当 fooBar 完成时,它会从堆栈中移除,并且不再有对 MySingleton 的引用。如果我在这里的任何地方错了,请纠正我。现在,我们知道 [MySingleton doSomeBackgroundJazz] 中的 block 代码强烈引用了 A。但是,为什么这很重要? A 不引用 MySingleton。 MySingleton 强烈引用 A。不需要弱强舞蹈。

然而,当我加入弱强的舞蹈时……我们的问题得到了缓解。 A不再停留。 (现在我们面临的现实世界问题是离开一个 View 并返回,继续创建一个新 View 并保留以前的 View 。每个人都监听通知,并进行 API 调用。所以我们可能有几十个 API每秒都有电话响起)。

弱强舞为什么要解决这个问题?

最佳答案

假设A您的来电者是 -doSomeBackgroundJazz:

看来你的MySingleton类将您的 block 存储到属性中。

因为你捕获了self ( A ) 在您的 block 中,当该 block 存储到属性中时,它也会被保留。

因此,这意味着只要保留您的单例实例 ( sharedInstance ),它的 block 属性就会保留,因此您捕获的 A被保留。

A 不保留 sharedInstance 并不重要。 ,它显然因某种原因而徘徊。

经验法则是转换 self__weak每当 block 要存储到属性中时。然而,总是做一个 __weak 并没有什么坏处。无论如何强制转换,很少会出现您希望 block 保留对象的情况

关于ios - 为什么 weak/strong dance 解决了这个 strong reference cycle?我不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com