1
我在awakeFromNib
函數中創建了一個局部變量,在一個UIView
動畫塊中使用它,但它永遠不會被釋放,爲什麼?Swift,爲什麼這個本地變量不被釋放?
這裏是(在一個UITableViewCell內awakeFromNib)代碼
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是在我的應用程序的一個選項卡的根,所以UITableView的是永遠不會釋放因此的UITableViewCell是從來由於可重用性而被釋放。 但爲什麼ARC會保留這個變量?僅用於功能和完成塊?
PS:我目前使用的可選DisposeBag我在完成塊設置爲零,但我不明白爲什麼我需要做的......
謝謝,這正是我的想法。我將代碼移動到viewController,不幸的是,我認爲沒有其他方式與rxSwift這樣的情況比聲明disposeBag可選,強制解包時添加到disposeBag(我討厭使用「!」),然後設置disposeBag在動畫完成時爲零 – Devous
在完成塊中執行'fullPhotoDisposeBag = DisposeBag()'怎麼辦?這應該足以清空原來的'DisposeBag',打破保留週期,而不需要引入'Optional'。 –