我继承了一个在任何地方使用disposeBags的项目,但disposeBag似乎是一个巨大的内存泄漏。没有任何使用该包的视图控制器被取消分配,这导致订阅堆积。我'米
class TestViewController: UIViewController
{
@IBOutlet weak var testLabel: UILabel!
var basePresenter: BasePresenter = BasePresenter()
var disposeBag: DisposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
bindPresenter()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//self.disposeBag = DisposeBag() <------------
}
func bindPresenter() {
//super.bindPresenter()
basePresenter.testVariable.asDriver().drive(onNext: { test in
if !test.id.isEmpty {
self.testLabel.text = "Test text" //<------------
}
}).addDisposableTo(disposeBag)
}
deinit{
print("TestView was dealloc'd")
}
}
关键问题是处理程序中对&#34; self的引用。&#34;
我的理论是,self是一个强大的参考,这导致了一种情况,即使视图控制器弹出并且没有其他对视图控制器的引用,它仍然没有被解除分配,因为包有强大的参考它。圆形逻辑,其中袋子没有被处理,因为VC没有解除密封而且VC没有解除密封,因为袋子没有被丢弃。
注释掉的行
//self.disposeBag = DisposeBag()
调用时允许视图正确释放。
除了内存泄漏之外,我面临的问题是我不想在viewWillDisappear上丢弃该包,而是在弹出视图时。如果我在顶部添加一个视图,我需要它留下来,以防我回到这个视图。
非常感谢任何帮助!
答案 0 :(得分:2)
你的理论是正确的。您需要在订阅方法中使用弱或无主的self引用,而不是强引用。并在viewWillDissapear中删除disposeBag的赋值。当对象被暗示时,disposeBag将正确处理您的订阅者。
你设置了一个弱的自我引用:
basePresenter.testVariable.asDriver().drive(onNext: { [weak self] test in
if !test.id.isEmpty {
self?.testLabel.text = "Test text" // no longer a strong reference
}
}).disposed(by: disposeBag)