该对象到底存储在哪里?(迅速)

Vat*_*not 3 memory heap stack function swift

考虑以下代码:

class Foo
{

}

func foo() -> (Void -> Foo)
{
    var foo = Foo()
    return { foo }
}

var fooGen = foo()
Run Code Online (Sandbox Code Playgroud)

现在,无论何时调用fooGen,我都会得到存储的Foo实例。但是到底foo存储在哪里?它在堆栈中吗?如果是这样,那它的生命是什么?

Mar*_*n R 5

类和闭包都是引用类型

var foo = Foo()
Run Code Online (Sandbox Code Playgroud)

Foo在堆上创建一个对象,并将对该对象的(强)引用存储在本地堆栈变量中foo

return { foo }
Run Code Online (Sandbox Code Playgroud)

创建一个捕获的闭包foo,以便闭包包含对该对象的另一个(强)引用。从函数返回时,局部foo变量超出范围,仅保留来自闭包的一个引用。

var fooGen = foo()
Run Code Online (Sandbox Code Playgroud)

使得fooGen返回的封闭件(其又具有对基准的基准Foo对象):

fooGen -> closure -> Foo object
Run Code Online (Sandbox Code Playgroud)

因此Foo,只要fooGen引用存在,对象就存在(假设没有创建其他强引用)。

演示:

class Foo
{
    deinit {
        println("deinit")
    }
}

func foo() -> (Void -> Foo)
{
    var foo = Foo()
    return { foo }
}

if true {
    var fooGen = foo()
    println("foo")
}

println("done")
Run Code Online (Sandbox Code Playgroud)

输出:

富
取消初始化
做完了

当程序控制离开的范围时,该对象将被销毁fooGen