Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 斯威夫特,为什么不发布本地风险值?_Swift_Automatic Ref Counting_Rx Swift - Fatal编程技术网

Swift 斯威夫特,为什么不发布本地风险值?

Swift 斯威夫特,为什么不发布本地风险值?,swift,automatic-ref-counting,rx-swift,Swift,Automatic Ref Counting,Rx Swift,我在awakeFromNib函数中创建了一个本地变量,在UIView动画块中使用它,但它从未被释放,为什么 以下是代码(在UITableViewCell中的awakeFromNib中) 一个线索是tableView位于我的应用程序的一个选项卡的根目录下,因此UITableView永远不会解除分配,因此UITableViewCell由于可重用性永远不会解除分配。 但是为什么ARC会保持这个变量呢?仅在函数和完成块中使用 PS:我目前使用一个可选的DisposeBag,我在completion块中将

我在
awakeFromNib
函数中创建了一个本地变量,在
UIView
动画块中使用它,但它从未被释放,为什么

以下是代码(在UITableViewCell中的awakeFromNib中)

一个线索是tableView位于我的应用程序的一个选项卡的根目录下,因此UITableView永远不会解除分配,因此UITableViewCell由于可重用性永远不会解除分配。 但是为什么ARC会保持这个变量呢?仅在函数和完成块中使用


PS:我目前使用一个可选的DisposeBag,我在completion块中将它设置为nil,但我不明白为什么我需要这样做…

看起来像一个保留循环。我猜垃圾收集器不会释放局部变量,直到完成闭包停止引用它,并且完成闭包永远不会被释放,因为它属于您的局部函数


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

谢谢,这就是我的想法。我将把代码移到viewController,不幸的是,我想rxSwift除了声明disposeBag是可选的,在添加到disposeBag时强制展开(我讨厌使用“!”),然后在动画完成时将disposeBag设置为零怎么样在完成块中?这应该足以清空原始的
DisposeBag
,打破保留循环,同时不需要引入
可选的
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)