作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑以下代码:
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")
输出:
foodeinitdone
当程序控制离开 fooGen
的范围时,该对象被销毁。
关于swift - 这个对象究竟存储在哪里? ( swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30604368/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!