我在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,但我不明白为什么我需要这样做......
答案 0 :(得分:1)
看起来像保留周期。我的猜测是垃圾收集器不会释放局部变量,直到完成闭包停止引用它,并且完成闭包永远不会被释放,因为它由你的本地函数拥有。
我的建议是将此代码从您的UIView转移到您的UIViewController,因为这是应该定义这种行为的地方。