2017-10-21 138 views
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我在完成塊設置爲零,但我不明白爲什麼我需要做的......

回答

1

看起來像一個保留週期。我的猜測是,垃圾收集器不會釋放局部變量,直到完成閉包停止引用它,並且完成閉包永遠不會被釋放,因爲它由本地函數擁有。

我的建議是將這段代碼從你的UIView移走到你的UIViewController,因爲那是應該定義這種行爲的地方。

+0

謝謝,這正是我的想法。我將代碼移動到viewController,不幸的是,我認爲沒有其他方式與rxSwift這樣的情況比聲明disposeBag可選,強制解包時添加到disposeBag(我討厭使用「!」),然後設置disposeBag在動畫完成時爲零 – Devous

+0

在完成塊中執行'fullPhotoDisposeBag = DisposeBag()'怎麼辦?這應該足以清空原來的'DisposeBag',打破保留週期,而不需要引入'Optional'。 –

相關問題