TL;DR
我有一个结构体和一个类。该结构体引用了该类的实例,而该对象具有捕获该结构体的闭包。 如果对该对象的引用是unowned,那么它们两者都会被析构。如果对该对象的引用是weak,则它们会互相保留。 为什么?
我有一个结构体和一个类,它们可能相互引用,我试图理解保留周期以及打破它们的方法。所以我在playground中做了一些尝试。
给出以下代码:
struct A {
unowned var b: B
init(b: B) {
self.b = b
}
func setup() {
print("A setup")
b.didSomethingClosure = {
print("A: b did do something")
self.printSomething()
}
}
func printSomething() {
print("A: A did do something")
}
}
class B {
var didSomethingClosure:(() -> Void)?
func doSomething() {
print("B: do something")
didDoSomething()
}
func didDoSomething() {
print("B: did something")
if let closure = didSomethingClosure {
closure()
}
}
deinit {
print("B: deinit")
}
}
do {
let b = B()
let a = A(b: b)
a.setup()
b.doSomething()
print("end do")
}
如果在结构体中声明变量b为
unowned var b: B
,则会释放B对象。如果我将代码修改为weak var b: B?
,然后b?.didSomethingClosure = ...
,则B对象会被保留。为什么呢?