gpt4 book ai didi

ios - DisposeBag 内存泄漏?

转载 作者:行者123 更新时间:2023-12-01 19:53:19 27 4
gpt4 key购买 nike

我继承了一个到处使用 disposeBags 的项目,但 disposeBag 似乎是一个巨大的内存泄漏。使用包的 View Controller 都没有被释放,这导致订阅堆积。我是

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")
}
}

关键问题是处理程序中对“self”的引用。
我的理论是 self 是一个强引用,这会导致即使 View Controller 被弹出并且没有其他对 View Controller 的引用,它仍然不会被释放,因为包有一个强引用它。循环逻辑,其中袋子没有被处置,因为 VC 没有解除分配,VC 没有解除分配,因为袋子没有被处置。

注释掉的行
//self.disposeBag = DisposeBag()

调用时允许 View 正确释放。

除了内存泄漏之外,我面临的问题是我不想在 viewWillDisappear 上处理包,而是在弹出 View 时处理。如果我在顶部添加一个 View ,我需要它坚持下去,以防我弹回这个 View 。

任何帮助将不胜感激!

最佳答案

你的理论是正确的。您需要在订阅方法中使用对 self 的弱引用或无主引用,而不是强引用。并去掉 viewWillDissapear 中 disposeBag 的赋值。当对象被删除时, disposeBag 将正确处理您的订阅者。

您像这样设置对 self 的弱引用:

   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)

关于ios - DisposeBag 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44296776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com