这里的代码的想法是删除一个视图(self.mv
)时,它已经被UIDynamicAnimator
动画出入画面。
下面的代码是基于从书编程的iOS 12由马特·诺伊堡第4章的例子。笔者认为这两种行为和(代码self.mv
)的观点不会被取消分配。但他并没有对这个广泛阐述。
我的问题是:
self.anim.removeAllBehaviors()
的行为?self.mv
?我使用的仪器,但我不太明白输出。这是否意味着动画师保留呢?但也有唯一的绿色对号。
随着在Xcode中“调试内存图”的工具,我看到UIGravityBehavior
仍受到self.anim.removeAllBehaviors()
被称为即使在动画保留。
class MyView : UIView {
deinit {
print("dddddddd")
}
}
class ViewController: UIViewController {
var anim : UIDynamicAnimator!
weak var mv : MyView?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let v = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
v.backgroundColor = .red
self.view.addSubview(v)
self.mv = v
let grav = UIGravityBehavior()
self.anim = UIDynamicAnimator(referenceView: self.view)
self.anim.addBehavior(grav)
grav.action = {
let items = self.anim.views(in: self.view.bounds)
let idx = items.firstIndex(of: self.mv!)
if idx == nil {
self.anim.removeAllBehaviors()
self.mv!.removeFromSuperview()
// self.anim = nil // without this, the `MyView` is not deallocated.
}
}
grav.addItem(v)
}
}
你有:
var anim : UIDynamicAnimator!
如果你把它:
var anim : UIDynamicAnimator?
和nil
它在回调完成后动画的时候,应该解决您的额外保留:
if idx == nil {
self.anim?.removeAllBehaviors()
self.mv!.removeFromSuperview()
self.anim = nil // without this, the `MyView` is not deallocated.
}
自拥有动画拥有GRAV拥有该动作框,其保留自我。
这是一个保留循环,因此自我的引用计数将永远不会被递减到零,所以自会泄漏。
你需要做的weakself舞解决这个问题。
{[weak self] in
if let strongSelf = self {
let items = strongSelf.anim.views(in: strongSelf.view.bounds)
...