我是学习ios开发的学生
我想知道Driver如何不进行循环引用?
下面两个代码显示不同的结果
// viewController deinit
publishRelay
.asDriver(onErrorJustReturn: "")
.drive(self.publishRelay2)
.disposed(by: disposeBag)
// viewContoller doen't deinit
publishRelay
.subscribe(onNext: { [self] _ in
self.publishRelay2.onNext("")
})
.disposed(by: disposeBag)
我看了驱动器代码,但有节点代码将 self 引用为弱引用。
以下为驱动方法,强参考发生
请帮我解决这个问题谢谢
您是正确的,
drive
不会从订阅到self
(视图控制器)创建弱引用。事实上,它根本不会创建对 self
的 any引用。这就是为什么没有保留周期。
.drive(self.publishRelay2)
不会将 self
传递到 drive
。它仅将 publishRelay2
传递到 drive
。这里的self
仅仅是限定publishRelay2
,意思是“我的意思是publishRelay2
的self
属性,而不是其他称为publishRelay2
的属性”。如果没有名称冲突,这个self
将是多余的。
订阅将强烈引用
publishRelay2
。这可以在 drive
的实现中看到,因为传递给 subscribe
的闭包捕获了 observers
。但这本身并不会创建保留周期,因为从 publishRelay2
到 self
没有强引用。
另一方面,在
.subscribe(onNext: { [self] _ in ... }
的情况下,您正在传递一个强烈捕获 self
的闭包。订阅会对闭包有强引用,闭包对self
有强引用。
如果闭包只捕获了
publishRelay2
,那么也不会有保留周期:
.subscribe(onNext: { [publishRelay2] _ in
publishRelay2.onNext("")
}
// or if there is a name conflict and "self." is not redundant:
.subscribe(onNext: { [relay = self.publishRelay2] _ in
relay.onNext("")
}