awakeFromNib
関数でローカル変数を作成し、UIView
アニメーションブロック内で使用しますが、それは決して解放されません、なぜですか? UITableViewが割り当て解除されることはありませんので、ここで Swift、なぜこのローカルvarが解放されていないのですか?
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を使用しますが、私はそれを行う必要があり、なぜ私は理解していない...
ありがとう、それは私が考えていたものです。残念ながら、残念ながら、disposeBagをオプションで宣言するよりもrxSwiftで他の方法がないと思うので、disposeBagに追加するときにアンラップを強制します(「!」を使用したくない)し、disposeBagを設定しますアニメーションが終了したらゼロにする – Devous
補完ブロックで 'fullPhotoDisposeBag = DisposeBag()'を実行するのはどうですか?元の 'DisposeBag'を空にして、保持サイクルを破るだけで、' Optional'を導入する必要はありません。 –