这个对象究竟存储在哪里? (Swift)

Where exactly is this object being stored? (Swift)

考虑以下代码:

class Foo
{

}

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

var fooGen = foo()

现在,每当我调用 fooGen 时,我都会得到存储的 Foo 实例。但是 foo 究竟存储在哪里?它在堆栈中吗?如果是,那么它的寿命是多少?

类和闭包都是引用类型

var foo = Foo()

在堆上创建一个 Foo 对象,并存储一个 (强)在本地堆栈变量 foo.

中引用该对象
return { foo }

创建一个捕获 foo 的闭包,以便闭包成立 对该对象的另一个(强)引用。 在函数的 return 上,局部 foo 变量超出范围, 只剩下一个来自闭包的引用。

var fooGen = foo()

使 fooGen 成为对 returned 闭包的引用(它又具有 对 Foo 对象的引用):

fooGen -> closure -> Foo object

所以只要 fooGen 引用存在,Foo 对象就存在 (假设没有创建额外的强引用)。

演示:

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

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

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

println("done")

输出:

foo
deinit
done

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