2015-06-02 4 views
3

Рассмотрим следующий код:Где именно хранится этот объект? (Swift)

class Foo 
{ 

} 

func foo() -> (Void -> Foo) 
{ 
    var foo = Foo() 
    return { foo } 
} 

var fooGen = foo() 

Теперь всякий раз, когда я называю fooGen, я получаю свой сохраненный Foo экземпляр. Но где именно хранится foo? Это внутри стека? И если да, то какая это жизнь?

ответ

4

Оба класса и затворы - ссылочные типы.

var foo = Foo() 

создает Foo объекта в куче, и сохраняет (сильную) ссылки на этот объект в локальном переменном стеке foo.

return { foo } 

создает замыкание, которое захватывает foo, так что закрытие имеет другую (сильную) ссылку на этот объект. При возврате из функции локальная переменная foo выходит за пределы области действия, , что остается только одна ссылка от закрытия.

var fooGen = foo() 

делает fooGen ссылка на возвращаемом закрытие (который, в свою очередь, имеет ссылка на Foo объекта):

fooGen -> closure -> Foo object 

Таким образом, 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") 

Выход:

 
foo 
deinit 
done 

Объект разрушается, когда программа управления выходит из сферы fooGen.

Смежные вопросы