这个对象究竟存储在哪里? (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
的范围时对象被销毁。
考虑以下代码:
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
的范围时对象被销毁。