gpt4 book ai didi

iphone - 保留周期: Why is that such a bad thing?

转载 作者:行者123 更新时间:2023-12-03 18:29:45 24 4
gpt4 key购买 nike

有两个对象 A 和 B。A 创建 B 并保留它。 B 有一个指向 A 的实例变量,保留它。所以双方都保留着对方。有人说,这种牢固的联系再也不能被打破了。

但事实真的是这样吗?

如果 B 释放 A,那么 A 可以轻松释放 B,因此 B 将被释放。一旦 A 的其他所有者(我猜一定有人)释放它,它就会被释放。

或者这个问题是否仅适用于 A 不创建 B,而只是通过将其保留在实例变量中来对其进行强引用的情况?我仍然不明白为什么该连接无法再次断开。

最佳答案

循环并不是坏事,但它们经常被避免,因为它们会让确保没有内存泄漏变得棘手。尤其是当对象被“引用计数”时,就会发生泄漏。在使用引用计数的语言或系统中,对象会跟踪指向它的引用的数量。每次删除引用时,计数都会减少,当计数为零时,说明没有引用,因此可以删除该对象。

这通常会自行解决并且无需任何仔细思考即可正常工作。如果你有一组没有循环的对象,并且你删除了对根对象的引用,那么它将被删除,这意味着它对其拥有的对象的引用将被删除,被引用的对象将有它们的引用计数归零。它们将被删除,级联将导致所有对象被删除。

但是...如果你有一个循环,这个级联就不起作用。您可能有一组对象,并且您不再需要它们,因此您删除了对这些对象的唯一引用,但由于存在一个循环,因此对象相互引用。这意味着它们的引用计数永远不会为零,并且不会被删除。这是内存泄漏。

显然,在删除对一组不再需要的对象的引用之前,您可以进行一些仔细的管理并打破循环。但是……正如我刚才所说,这需要仔细管理。这很容易出错。这是发生内存泄漏的主要原因之一。

为了避免泄漏风险以及当不再需要一组对象时正确打破循环的棘手工作,程序员通常会尝试避免循环。对于有许多程序员的大型项目来说,这一点变得更加重要,因为没有人了解整个系统。如果存在循环,程序员就必须小心并花费很长时间研究彼此的代码以避免循环。

一些带有垃圾收集器的语言(例如C#)可以删除一组不再需要的对象,即使该组包含循环。

关于iphone - 保留周期: Why is that such a bad thing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/791322/

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