gpt4 book ai didi

swift - 在快速关闭中使用 `[weak self]` 是正确的方法吗?

转载 作者:可可西里 更新时间:2023-11-01 00:38:35 32 4
gpt4 key购买 nike

我总是在 swift 闭包中使用 [weak self] 来防止引用循环。这是下面的代码,它是正确的方法吗?

someTask(completion: {[weak self] (result) in
if self == nil {
return
}

//is it safe when reach here?

self!.xxx = yyy
self!.doLongTermWork()
self!.finish() //will crash when self is nil?
})

弱小的 self 无法牢牢捕获实例。那么当self.doLongTermWork()时,self会不会在别的地方又被设置为nil呢?

最佳答案

您的模式存在竞争条件。如果 self 在执行完成处理程序闭包的同时被释放,它可能会崩溃。作为一般规则,请尽可能避免使用 ! 强制解包运算符。

  1. 我倾向于guard“提早退出”模式(减少嵌套大括号,使代码更易于阅读)。标准的 Swift 4.2 解决方案是:

    someTask { [weak self] result in
    guard let self = self else { return }

    self.xxx = yyy
    self.doLongTermWork()
    self.finish()
    }
  2. 在 Swift 4.2 之前,实现了 SE-0079 ,我们必须做类似的事情:

    someTask { [weak self] result in
    guard let strongSelf = self else { return }

    strongSelf.xxx = yyy
    strongSelf.doLongTermWork()
    strongSelf.finish()
    }

    您会明白为什么我们更喜欢 Swift 4.2 的改进,因为这种 strongSelf 语法不够优雅。

  3. 另一个明显的选择是:

    someTask { [weak self] result in
    self?.xxx = yyy
    self?.doLongTermWork()
    self?.finish()
    }

    有时你需要“弱自强自舞”(前两种选择),但这里似乎不是这种情况。这可能就足够了。

人们可能会考虑其他场景/边缘情况,但这些是基本方法。

关于swift - 在快速关闭中使用 `[weak self]` 是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54719191/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com