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

Leg*_*tik 6 automatic-ref-counting swift

我已经阅读了关于何时应该使用[weak self] [unowned self]在闭包中的StackOverflow的几个讨论.

但是,是否有任何情况下,当我们没有使用没有他们,因为当我们只是明确使用斯威夫特不显示任何错误或警告self封闭内.

例如,我们应该使用weak还是unowned在这里?

UIView.animate(withDuration: 0.3) {
    self.view.alpha = 0.0
}
Run Code Online (Sandbox Code Playgroud)

Dáv*_*tor 6

如果闭合可能导致强参考周期,则需要使用[弱自我]或[无主自我].

如果这可以发生分配封盖的属性自我,你是指或属性 关闭本身.闭包是引用类型,因此基本上相同的规则适用于强引用,就像使用普通类一样.

至于你的例子,不需要[weak self]或者[unowned self],因为你没有将闭包分配给self引用的类中的变量,所以不会有强引用循环.

有关更多信息,请查看Swift编程语言指南中的" 闭包强引用循环"部分.以下是上述链接中的一个示例:何时可以通过闭包引起强引用循环:

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")
    }

}
Run Code Online (Sandbox Code Playgroud)

如果没有[unowned self]关闭asHTML,分配给的闭包将导致强大的参考周期asHTML.将实现更改为asHTML以下内容可解决此问题:

lazy var asHTML: () -> String = {
    [unowned self] in
    if let text = self.text {
        return "<\(self.name)>\(text)</\(self.name)>"
    } else {
        return "<\(self.name) />"
    }
}
Run Code Online (Sandbox Code Playgroud)