持有弱参考会阻止保留周期被视为泄漏吗?

时间:2018-01-23 21:14:20

标签: swift memory-leaks

请考虑以下代码。我创建了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个对象 会被标记为泄漏。

如果没有外部引用,保留周期是否仅被视为泄漏?

1 个答案:

答案 0 :(得分:4)

保留周期是对象的“循环”,每个对象都有一个强引用 到下一个,所以没有一个可以解除分配。

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

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

此处aFoo属于弱属性,这与firstFoo无关。 因此,实例永远不会被释放(作为保留周期的一部分) 弱引用永远不会消失。