2017-10-21 5 views
1

awakeFromNib関数でローカル変数を作成し、UIViewアニメーションブロック内で使用しますが、それは決して解放されません、なぜですか? UITableViewが割り当て解除されることはありませんので、ここで Swift、なぜこのローカルvarが解放されていないのですか?

は、このようにUITableViewCellのは決してありません、

var fullPhotoDisposeBag = DisposeBag() 
fullScreenImageView.rx.tapGesture().when(UIGestureRecognizerState.recognized).subscribe(onNext: { (tap) in 

     UIView.animate(withDuration: 0.15, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: { 
      fullScreenImageView.frame = oldFullScreenFrame 
     }, completion: { (finished) in 
      fullScreenImageView.removeFromSuperview() 
      let _ = fullPhotoDisposeBag //This line avoid early release, but retains too much... 
     }) 
}, onDisposed:{ 
     print("disposed") 
}).addDisposableTo(fullPhotoDisposeBag) 

一つの手掛かりがのtableViewは、私のアプリの一つのタブのルートにあるということである(UITableViewCellの中awakeFromNib内側)のコードです再利用のために割り当てが解除されました。 しかし、なぜARCはその変数を保持しますか?関数と補完ブロックでのみ使用されますか?

PS:私は現在、私が完了ブロックにnilに設定され、オプションのDisposeBagを使用しますが、私はそれを行う必要があり、なぜ私は理解していない...

答えて

1

が保持サイクルのように見えます。私の推測では、ガベージコレクタは完了クロージャが参照を停止するまでローカル変数を解放せず、完了クロージャはローカル関数によって所有されているため解放されません。

このコードをUIViewからUIViewControllerに移動することをお勧めします。これは、この種の動作を定義する必要があるためです。

+0

ありがとう、それは私が考えていたものです。残念ながら、残念ながら、disposeBagをオプションで宣言するよりもrxSwiftで他の方法がないと思うので、disposeBagに追加するときにアンラップを強制します(「!」を使用したくない)し、disposeBagを設定しますアニメーションが終了したらゼロにする – Devous

+0

補完ブロックで 'fullPhotoDisposeBag = DisposeBag()'を実行するのはどうですか?元の 'DisposeBag'を空にして、保持サイクルを破るだけで、' Optional'を導入する必要はありません。 –

関連する問題