【发布时间】:2019-05-04 00:03:50
【问题描述】:
苹果有documentation that describes how retain cycles work in closures。这是他们的闭包示例,不会导致保留循环。
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in
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")
}
}
我偶尔喜欢将函数定义传递给回调,以尝试摆脱回调地狱的代码。
这个例子有点做作,但这会导致保留循环吗?将这样的函数分配给闭包会导致保留循环吗?
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = self.returnHTML
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
func returnHTML() -> String {
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}
deinit {
print("\(name) is being deinitialized")
}
}
【问题讨论】:
标签: ios swift iphone automatic-ref-counting