先看以下代码:
@IBAction func scriptActionBtnClick() {
// 埋点?
let completion = completion
dismiss(animated: true) {
completion?((1, nil))
}
}
问题:
- 其中,let completion = completion的作用是什么?
- 这和直接在dismiss中使用[weak self],self?.completion有啥区别?
直接使用 weak self
和使用 let completion = completion
的区别在于两者解决问题的方式不同:
-
使用
weak self
:- 这种方式通过捕获
self
的弱引用(weakSelf
)来防止闭包中产生强引用循环。当self
被释放时,weakSelf
变为nil
。在这种情况下,你需要在闭包中检查weakSelf
是否为nil
,然后再调用weakSelf.completion
。 - 如果
self
在dismiss
的过程中被释放,那么weakSelf.completion
可能是nil
,导致闭包无法正常执行。
- 这种方式通过捕获
-
使用
let completion = completion
:- 这种方式在方法开始时,将
self.completion
赋值给一个局部变量completion
,这个局部变量被闭包捕获,即使self
在dismiss
过程中被释放,completion
也依然存在。 - 这可以确保
dismiss
完成后,闭包中的代码仍然可以正常调用completion
,不会因为self
被释放而影响执行。
- 这种方式在方法开始时,将
总结:
- 使用
weak self
可以防止循环引用,但如果self
被释放了,weakSelf.completion
可能会失效。 - 使用
let completion = completion
确保在闭包中能始终访问到completion
,即使self
已经被释放。
简单来说,let completion = completion
是为了确保在闭包中始终能正确地调用 completion
,而不受 self
是否被释放的影响。
网友评论