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

Dun*_*n C 1 memory-leaks swift

考虑以下代码。我创建了 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    
}
Run Code Online (Sandbox Code Playgroud)

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

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

当没有外部引用时,保留循环是否仅被视为泄漏?

Mar*_*n R 5

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

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

在您的情况下,这两个Foo实例构建了一个保留循环,但这不是泄漏(只要FooContainer实例存在),因为可以通过aFoo 属性访问实例。

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