请考虑以下代码。我创建了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
}
以上肯定是保留周期,但它是内存泄漏吗?我将对其中一个对象的弱引用保存到实例变量中。
仪器泄漏仪器和Xcode的内存图实用程序都没有将上述内容标记为泄漏。如果您将作业移至aFoo
,则2 Foo
个对象 会被标记为泄漏。
如果没有外部引用,保留周期是否仅被视为泄漏?
答案 0 :(得分:4)
保留周期是对象的“循环”,每个对象都有一个强引用 到下一个,所以没有一个可以解除分配。
泄漏分配的内存不是“可访问的”,即没有 指向它。
在您的情况下,两个Foo
实例构建一个保留周期,但确实如此
不是泄漏(只要FooContainer
实例存在)
因为可以通过aFoo
访问实例
属性。
此处aFoo
属于弱属性,这与firstFoo
无关。
因此,实例永远不会被释放(作为保留周期的一部分)
弱引用永远不会消失。