这里代码的思想是在视图(self.mv)被UIDynamicAnimator从屏幕外动画时移除它。
下面的代码基于Matt编写的“编程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)
}
}发布于 2019-02-05 21:56:26
你有:
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.
}发布于 2019-02-02 16:17:43
自我拥有拥有格拉夫的阿尼姆,拥有保留自我的动作块。
这是一个retain循环,所以self的引用计数永远不会减少到零,所以self会泄漏。
你得跳个懦弱的舞蹈才能解决这个问题。
{[weak self] in
if let strongSelf = self {
let items = strongSelf.anim.views(in: strongSelf.view.bounds)
...https://stackoverflow.com/questions/54493876
复制相似问题