![e64480714f95af0db13287ec76530d75.png](https://i-blog.csdnimg.cn/blog_migrate/80bc9694ec8760aa65e2099fe26f6c52.jpeg)
用到 Swift 的闭包的时候,我们经常会加 [weak self]
。
但你有没有问过自己,它是不是非加不可?
比如这个场景:
class YourViewController {
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
// [weak self] in
print(self)
}
dismiss(animated: true)
}
}
假如我们 present
这个控制器,它将在 viewDidLoad()
中被 dismiss
,也就是说它还没完全出现的时候就会被关闭。
那么这里的asyncAfter
,即 2 秒钟之后执行print(self)
,这个闭包有没有必要加[weak self]
?
循环引用?
首先的首先,关于闭包引起的循环引用,官方是这样介绍的:
Strong Reference Cycles for Closures - The Swift Programming Languagedocs.swift.org![912a7f93b5b3903b037df861768191a0.png](https://i-blog.csdnimg.cn/blog_migrate/0b248b5e616a37e0a61080d1863dfc02.png)
一问 [weak self]
的用途,估计很多人都会说“避免循环引用”。那么此处有没有循环引用呢?
如果你的答案是“当然没有”,你可以直接看下一节。
asyncAfter
这段代码等价于:
let closure = {
print(self) }
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: closure)
dismiss(animated: true)
如果此处有循环引用,那我们讨论的应该是 closure
与