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存储在哪里?它在堆栈中吗?如果是这样,那它的生命是什么?
类和闭包都是引用类型。
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。