【问题标题】:Where exactly is this object being stored? (Swift)这个对象到底存储在哪里? (迅速)
【发布时间】:2015-08-16 17:38:05
【问题描述】:
考虑以下代码:
class Foo
{
}
func foo() -> (Void -> Foo)
{
var foo = Foo()
return { foo }
}
var fooGen = foo()
现在,每当我调用 fooGen 时,我都会得到我存储的 Foo 实例。但是foo 到底存储在哪里?是在栈里面吗?如果是这样,那么它的寿命是多少?
【问题讨论】:
标签:
swift
function
memory
heap-memory
stack-memory
【解决方案1】:
类和闭包都是引用类型。
var foo = Foo()
在堆上创建一个Foo 对象,并存储一个
(强)在本地堆栈变量foo 中对该对象的引用。
return { foo }
创建一个捕获foo 的闭包,这样闭包就成立了
对该对象的另一个(强)引用。
从函数返回时,本地 foo 变量超出范围,
只剩下一个来自闭包的引用。
var fooGen = foo()
使fooGen 成为对返回的闭包的引用(这反过来又具有
对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")
输出:
富
去初始化
完毕
当程序控制离开fooGen的范围时对象被销毁。