gpt4 book ai didi

swift - 持有弱引用是否可以防止保留循环被视为泄漏?

转载 作者:搜寻专家 更新时间:2023-11-01 06:14:17 26 4
gpt4 key购买 nike

考虑以下代码。我创建了 2 个 Foo 对象并为它们中的每一个都提供了对另一个的强引用:

class Foo: {
var otherFoo: Foo?
var value: Int
}

class FooContainer {

weak var aFoo: Foo?

var firstFoo = Foo(otherFoo: nil, value: 1)
var secondFoo = Foo(otherFoo: firstFoo, value: 2)
firstFoo.otherFoo = secondFoo //The 2 foo objects now form a retain cycle
aFoo = firstFoo //save a weak reference to one of the Foo objects
}

上面肯定是retain cycle,但是是内存泄漏吗?我将对其中一个对象的弱引用保存到一个实例变量中。

Instruments Leaks 工具和 Xcode 的内存图实用程序都没有将上述标记为泄漏。如果您删除对 aFoo 的分配,则 2 个 Foo 对象将标记为泄漏。

是否只有在没有外部引用时才将保留循环视为泄漏?

最佳答案

保留循环是对象的“循环”,每个对象都持有一个强引用到下一个,这样它们都不能被释放。

泄漏 分配的内存不是“可访问的”,即没有指向它的指针。

在你的例子中,两个 Foo 实例构建了一个保留周期,但它是不是泄漏(只要 FooContainer 实例存在)因为可以通过 aFoo 访问实例属性(property)。

aFoo 是弱属性在这里无关紧要:firstFoo实例永远不会被释放(作为保留周期的一部分),因此弱引用永远不会失效。

关于swift - 持有弱引用是否可以防止保留循环被视为泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48410930/

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