Swift,为什么这个本地var没有发布?

时间:2017-10-21 05:11:46

标签: swift automatic-ref-counting rx-swift

我在awakeFromNib函数中创建一个局部变量,在UIView动画块中使用它,但它永远不会被释放,为什么?

这是代码(在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,我在完成块中设置为nil,但我不明白为什么我需要这样做......

1 个答案:

答案 0 :(得分:1)

看起来像保留周期。我的猜测是垃圾收集器不会释放局部变量,直到完成闭包停止引用它,并且完成闭包永远不会被释放,因为它由你的本地函数拥有。

我的建议是将此代码从您的UIView转移到您的UIViewController,因为这是应该定义这种行为的地方。