我经常这样做,
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
beep()
}
而在一个应用程序中,我们经常这样做
tickle.fresh(){
msg in
paint()
}
但如果你做 这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
msg in
paint()
}
}
当然你必须要做这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
msg in
self?.paint()
}
}
或者,可能是这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
或者也可能是这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
我们应该怎么做?
所有三个建议似乎都能完美地解决问题。这里的含义是什么?哪一个应该被执行?强引用指向弱引用还是弱引用指向强引用?生存还是毁灭?那是个问题!
self
将被外部闭包保持存活,但一旦它被执行,它可能在内部闭包执行之前被释放(假设它是异步执行的)。在最后一个示例中,我使用了带有guard let
的可选绑定,这将解包弱引用的self
,给我一个强引用 :) - Hamishself
,那么内部的[weak self]
就不必要了。 - Hamish