代码之家  ›  专栏  ›  技术社区  ›  Legonaftik

当我们既不应该使用[弱自我]也不应该使用[无主自我]?

  •  7
  • Legonaftik  · 技术社区  · 7 年前

    我读过几篇关于StackOverflow的讨论,关于我们应该何时使用 [weak self] [unowned self] 在封闭中。

    然而,有什么情况下我们不需要使用 也不 self 在封口内。

    weak unowned

    UIView.animate(withDuration: 0.3) {
        self.view.alpha = 0.0
    }
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Dávid Pásztor    7 年前

    如果你的闭包会导致一个强引用循环,你需要使用[弱自我]或[无主自我]。

    如果您 分配 对属性的闭包 你指的是 或财产 在…内

    至于你的例子,没有必要 [weak self] [unowned self] self 引用,因此不会有强引用循环。

    有关更多信息,请查看 Strong Reference Cycles for Closures

    class HTMLElement {
    
        let name: String
        let text: String?
    
        lazy var asHTML: () -> String = {
            if let text = self.text {
                return "<\(self.name)>\(text)</\(self.name)>"
            } else {
                return "<\(self.name) />"
            }
        }
    
        init(name: String, text: String? = nil) {
            self.name = name
            self.text = text
        }
    
        deinit {
            print("\(name) is being deinitialized")
        }
    
    }
    

    [无主自我] 在结束时 asHTML asHTML .改变实施 要解决此问题,请执行以下操作:

    lazy var asHTML: () -> String = {
        [unowned self] in
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }
    
        2
  •  2
  •   GetSwifty    7 年前

    这有点基于意见,所以我会给出我的意见:)

    我通常基于同步性。如果闭包是异步的,则调用闭包时调用实例可能不再存在,因此 [weak self] 应使用。如果闭包是同步的,那么它是不必要的,捕获强引用也很好。

    对于已建立且可预测的API(如UIView)。为了简洁起见,我个人倾向于使用strong self,但这是你需要自己做的评估,这取决于使用情况。

    同样如评论中所述,函数闭包也是如此。将闭包分配给另一个变量的属性有一组不同的问题。

    另外,我采用了弱引用闭包的方法,只需在我的类型中调用另一个方法,例如。

    thing.doSomethingWithAClosure() { [weak self]
        self?.doSomething()
    }