在 WWDC 2014 的 403 演讲中,涉及到以下幻灯片 Intermediate Swift 和 transcript。
演讲者说,如果我们不在那里使用[unowned self]
,就会出现内存泄漏。这是否意味着我们应该始终在闭包内部使用[unowned self]
?
在Swift天气应用程序的ViewController.swift的第64行上,我没有使用[unowned self]
。但是,我通过使用一些@IBOutlet
,如self.temperature
和self.loadingIndicator
来更新UI。这可能没问题,因为我定义的所有@IBOutlet
都是weak
的。但是为了安全起见,我们是否应该始终使用[unowned self]
?
class TempNotifier {
var onChange: (Int) -> Void = {_ in }
var currentTemp = 72
init() {
onChange = { [unowned self] temp in
self.currentTemp = temp
}
}
}
onChange
应该是一个[weak self]
闭包,因为它是一个公共属性(在内部是这样,但仍然如此),所以另一个对象可以获取并存储该闭包,从而保留TempNotifier
对象(如果使用的对象没有释放对onChange
的引用,直到看到TempNotifier
不见了,通过它自己对TempNotifier
的弱引用)。如果var onChange …
是private var onChange …
那么[unowned self]
将是正确的。我不完全确定这一点,如果我错了,请有人纠正我。 - Slipp D. Thompsonvar onChange: (Int) -> Void = {}
这里的花括号代表一个空闭包吗?就像用[]
定义一个空数组一样?我在 Apple 文档中找不到解释。 - bibscy{}
是空闭包(闭包的实例)作为默认值(什么也不做),(Int) -> Void
是闭包的定义。 - Jake Linweak someVarName
就像someVarName?
,而unowned someVarName
就像someVarName!
。 - Eric