【问题标题】: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的范围时对象被销毁。

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 2020-03-26
      • 2015-07-05
      • 1970-01-01
      • 2021-03-17
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多