DisposeBag内存泄漏?

时间:2017-06-01 00:46:24

标签: ios memory-leaks swift3 rx-swift

我继承了一个在任何地方使用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上丢弃该包,而是在弹出视图时。如果我在顶部添加一个视图,我需要它留下来,以防我回到这个视图。

非常感谢任何帮助!

1 个答案:

答案 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)