美文网首页
dismiss 外的 let completion = comp

dismiss 外的 let completion = comp

作者: 大成小栈 | 来源:发表于2024-09-04 10:48 被阅读0次

先看以下代码:

  @IBAction func scriptActionBtnClick() {
        // 埋点?
        let completion = completion
        dismiss(animated: true) {
            completion?((1, nil))
        }
    } 

问题:

  1. 其中,let completion = completion的作用是什么?
  2. 这和直接在dismiss中使用[weak self],self?.completion有啥区别?

直接使用 weak self 和使用 let completion = completion 的区别在于两者解决问题的方式不同:

  1. 使用 weak self:

    • 这种方式通过捕获 self 的弱引用(weakSelf)来防止闭包中产生强引用循环。当 self 被释放时,weakSelf 变为 nil。在这种情况下,你需要在闭包中检查 weakSelf 是否为 nil,然后再调用 weakSelf.completion
    • 如果 selfdismiss 的过程中被释放,那么 weakSelf.completion 可能是 nil,导致闭包无法正常执行。
  2. 使用 let completion = completion:

    • 这种方式在方法开始时,将 self.completion 赋值给一个局部变量 completion,这个局部变量被闭包捕获,即使 selfdismiss 过程中被释放,completion 也依然存在。
    • 这可以确保 dismiss 完成后,闭包中的代码仍然可以正常调用 completion,不会因为 self 被释放而影响执行。

总结:

  • 使用 weak self 可以防止循环引用,但如果 self 被释放了,weakSelf.completion 可能会失效。
  • 使用 let completion = completion 确保在闭包中能始终访问到 completion,即使 self 已经被释放。

简单来说,let completion = completion 是为了确保在闭包中始终能正确地调用 completion,而不受 self 是否被释放的影响。

相关文章

网友评论

      本文标题:dismiss 外的 let completion = comp

      本文链接:https://www.haomeiwen.com/subject/tavlljtx.html