Swift,为什么这个本地变量没有释放?
Swift, why this local var is not released?
我在 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,但我不明白为什么我需要这样做...
看起来像一个保留周期。我的猜测是垃圾收集器在完成闭包停止引用它之前不会释放局部变量,并且永远不会释放完成闭包,因为它由您的本地函数拥有。
我的建议是将此代码从您的 UIView 移至您的 UIViewController,因为应该在此处定义此类行为。
我在 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,但我不明白为什么我需要这样做...
看起来像一个保留周期。我的猜测是垃圾收集器在完成闭包停止引用它之前不会释放局部变量,并且永远不会释放完成闭包,因为它由您的本地函数拥有。
我的建议是将此代码从您的 UIView 移至您的 UIViewController,因为应该在此处定义此类行为。