Оба класса и затворы - ссылочные типы.
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
.