2017-06-01 8 views
1

私はどこでもdisposeBagsを使用するプロジェクトを継承しましたが、disposeBagは大量のメモリリークのようです。バッグを利用しているビューコントローラのうち、割り当てを解除したものはありません。これにより、サブスクリプションが積み重なってしまいます。私は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") 
    } 
} 

ハンドブックでは「自己」への参照が重要です。
私の理論は、自己が強い参照であり、ビューコントローラがポップされ、ビューコントローラへの他の参照がない場合でも、バッグが強いので、まだ割り当て解除されないという状況につながっているということですそれを参照してください。バッグが廃棄されないためにVCがデアロックしないためVCがデアロックしないため、バッグが廃棄されない循環ロジック。

コメントアウト行

//self.disposeBag = DisposeBag() 

に呼び出され、適切DEALLOCするビューが可能になります。

メモリリークの最前線で、私が直面している問題は、viewWillDisappearにバッグを配置したくないということです。ビューがポップされるときです。このビューにポップアップが戻った場合のために、上にビューを追加すると、私はそれを固執する必要があります。

ご協力いただければ幸いです!

+0

が、それは、UI要素への参照のみではありませんそれはまだVCが処分されない結果になるでしょう – Mars

答えて

1

あなたの理論は正しいです。あなたは強い参照ではなく、あなたの購読メソッドで、自己への弱いまたは無所属の参照を使用する必要があります。そして、viewWillDissapearのdisposeBagへの代入を取り除く。 disposeBagは、オブジェクトの解釈が行われたときに、サブスクライバを適切に破棄します。

このような自己への弱参照

あなたのセットアップ:私はself.testLabel.textの代わりに変数self.testString呼ばあればところで

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) 
+0

私はハンドラを変更しようとしました: 弱いセルフself = セルフ?.holder.text = "テストtext2" しかしそれはまだ処分されません。 – Mars

+0

また、ハンドラーを次のように変更しようとしました。 所有していないvar selfie = self、 selfie.holder.text = "Test text2" しかし、まだ処理されていません。 – Mars

+0

驚くべきことに、「[無名の自己テスト]はそれをした、私は[弱い自己]も動作すると仮定しています。これは本当にデフォルトの動作でなければならないと感じます...または、私はdisposebagアプリケーション理論の面で何かを見逃していますか? – Mars