Ale*_*loz 1 closures memory-management retain-cycle swift
在Swift中,我们可以在ObjC中没有很好的功能:可以在任何地方使用一个方法来使用闭包.但它可以导致保留周期.看看这个例子:
import Foundation
class C1 {
let closure: Void -> Void
init(closure: Void -> Void) {
self.closure = closure
}
deinit {
print("C1 deinit")
}
}
class C2 {
var c1: C1!
func initializeC1() {
c1 = C1(closure: f)
}
func f() {}
deinit {
print("C2 deinit")
}
}
func main() {
let c2 = C2()
c2.initializeC1()
}
main()
Run Code Online (Sandbox Code Playgroud)
这里我们创建了循环C2 - > C1 - > f - > C2.如果您运行此程序,deinit将不会被调用.但是,如果你更换f在initializeC1以{},例如,这将是.
对于常规闭包,我们可以使用捕获列表来避免强保留,但看起来您不能将它们用于方法.所以,问题是:在这种情况下我们怎么能打破保留周期呢?它有可能吗?
当然,我们可以通过将它包装在闭包中来"弱化"绑定方法,如下所示:
import Foundation
class C1 {
let closure: Void -> Void
init(closure: Void -> Void) {
self.closure = closure
}
deinit {
print("C1 deinit")
}
}
class C2 {
var c1: C1!
func initializeC1() {
// HERE we wrap a method call into a closure to break retain-cycle.
c1 = C1(closure: { [weak self] in
self?.f()
})
}
func f() {}
deinit {
print("C2 deinit")
}
}
func main() {
let c2 = C2()
c2.initializeC1()
}
main()
//C2 deinit
//C1 deinit
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
422 次 |
| 最近记录: |