DisposeBag内存泄漏?

DisposeBag memory leak?

我继承了一个到处使用disposeBags的项目,但是disposeBag似乎是一个巨大的内存泄漏。 None 的使用包的视图控制器曾经被释放,这导致订阅堆积。我

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 是一个强引用,这会导致这样一种情况,即使弹出视图控制器并且没有其他对视图控制器的引用,它仍然没有被释放,因为包有一个强引用它。由于 VC 没有释放而 VC 没有释放,因为袋子没有被释放的循环逻辑。

注释掉的行

//self.disposeBag = DisposeBag()

调用时允许视图正确解除分配。

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

如有任何帮助,我们将不胜感激!

你的理论是正确的。您需要在订阅方法中使用对 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)