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对象将被标记为泄漏。
当没有外部引用时,保留循环是否仅被视为泄漏?
一个保留循环是一个对象的“循环”,每个对象都持有对下一个的强引用,因此它们都不能被释放。
一个泄漏分配的内存是不是“访问”,即有没有指针指向它。
在您的情况下,这两个Foo实例构建了一个保留循环,但这不是泄漏(只要FooContainer实例存在),因为可以通过aFoo
属性访问实例。
aFoo弱属性在这里无关紧要 :firstFoo
实例永远不会被释放(作为保留循环的一部分),因此弱引用永远不会被取消。
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |