此处代码的想法是在视图 ( self.mv
) 已被UIDynamicAnimator
.
下面的代码基于Matt Neuburg编写的iOS 12 编程一书的第 4 章中的示例。作者说行为和视图(self.mv
在代码中)都不会被释放。但他没有详细说明这一点。
我的问题是:
谁还保留着之后的行为
self.anim.removeAllBehaviors()
?谁还留着
self.mv
?
我使用了 Instruments,但我不太了解输出。这是否意味着动画师保留了它?但是只有绿色的复选标记。
使用 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)
}
}