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

标签 swift function memory heap-memory stack-memory

考虑以下代码:

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的闭包,这样闭包就成立了 对该对象的另一个(强)引用。 从函数返回时,本地 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")

输出:

foo
deinit
done

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

关于swift - 这个对象究竟存储在哪里? ( swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30604368/

相关文章:

ios - 将文件从 Google Drive 共享到 Dropbox,反之亦然

ios - 移动按钮从右到左动画 iOS - swift

Javascript使用嵌套函数作为对象来访问

java - 在 JNI 方法中的 GetStringUTFChars 期间,java 中出现内存不足错误,其中包含垃圾字符大小

go - 使用结构对常量进行分组有哪些副作用

c - 结构体与链表代码C中动态分配的结构体

swift - 非可选值如何获得 nil 值?

ios - 从解析推送通知中提取消息的快速解决方案

c++ - 为什么不允许按值将数组传递给 C 和 C++ 中的函数?

javascript - 在Javascript中,这个参数如何通过值而不是通过引用传递?