【问题标题】:Swift, why this local var is not released?斯威夫特,为什么这个本地变量没有发布?
【发布时间】:2017-10-21 05:11:45
【问题描述】:

我在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,但我不明白为什么我需要这样做......

【问题讨论】:

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


    【解决方案1】:

    看起来像一个保留周期。我的猜测是垃圾收集器在完成闭包停止引用它之前不会释放局部变量,并且完成闭包永远不会释放,因为它归您的本地函数所有。

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

    【讨论】:

    • 谢谢,我就是这么想的。我将代码移动到 viewController,不幸的是,对于这种情况,我想 rxSwift 除了声明 disposeBag 可选,在添加到 disposeBag 时强制展开(我讨厌使用“!”)然后设置 disposeBag动画完成后为零
    • 在完成块中做fullPhotoDisposeBag = DisposeBag()怎么样?这足以清空原来的DisposeBag,打破保留周期,同时不需要你引入Optional
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2018-09-01
    相关资源
    最近更新 更多