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)
如果闭合可能导致强参考周期,则需要使用[弱自我]或[无主自我].
如果这可以发生分配封盖的属性自我,你是指自或属性自 内关闭本身.闭包是引用类型,因此基本上相同的规则适用于强引用,就像使用普通类一样.
至于你的例子,不需要[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)
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |