【发布时间】:2015-10-07 21:12:16
【问题描述】:
我对在闭包中使用 self 感到困惑。
我们什么时候应该声明 [weak self] ?我理解的一个明显案例是
class Foo{
var closure: ( Void -> Void )?
var x = 0
func doSomething(){
closure = { [weak self] in
if let x = self?.x{
println(x)
}
}
}
}
但是,如果我想创建一个计算属性bar,它有一个闭包,它会在内部捕获 self。像这样,
extension Foo{
var bar: Bar{
let bar = Bar()
bar.completionHandler = {
println(self.x)
}
return bar
}
}
我应该在这个闭包中使用[weak self] 吗?
【问题讨论】:
-
闭包也是类的引用类型。因此,如果您正在调用捕获的块/闭包(假设来自代码的另一部分而不是来自同一个类),那么这个闭包将对调用它的实例有一个强引用。这就是为什么有时需要
[weak self]以便您的实例可以稍后解除分配的原因。但是通过添加[weak self],您必须确保在执行闭包时您的self仍然存在。例如:if let weakSelf = self { /* do your work here*/ }. -
也许这篇文章会帮助你更好地理解它:sketchytech.blogspot.de/2014/09/… :)
-
“闭包也是类的引用类型。”你有这方面的资料吗?
-
虽然 Foo 没有对 bar 的引用,因为它是一个计算机属性,你仍然可以将它分配给 Foo 的另一个实例变量,然后你会得到一个引用循环。所以使用
[weak self]是有意义的。 -
@newacct - “‘闭包也是类的引用类型。’你有这方面的资料吗?” ... 我知道那是一条旧评论,但是 The Swift Programming Language 中有一段标题为 Closures are Reference Types。
标签: swift closures retain-cycle