gpt4 book ai didi

swift - 为什么调用UIDynamicBehavior的action closure后会出现memory leak/retain cycle?

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:15 24 4
gpt4 key购买 nike

此处代码的想法是在 View (self.mv) 被 UIDynamicAnimator 设置为动画离开屏幕时删除它。

下面的代码基于 Matt Neuburg 着的iOS 12 编程一书第 4 章中的示例。作者说行为和 View (代码中的 self.mv)都不会被取消分配。但他没有详细说明这一点。

我的问题是:

  1. 谁在 self.anim.removeAllBehaviors() 之后仍然保留行为?

  2. 谁还保留着self.mv

我使用了 Instruments,但我不太了解输出结果。这是否意味着动画师保留了它?但是只有绿色的复选标记。

Instruments screen shot

通过 XCode 中的“Debug Memory Graph”工具,我看到 UIGravityBehavior 即使在 self.anim.removeAllBehaviors() 被调用后仍然被动画师保留。

Debug Memory Graph

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.
}

关于swift - 为什么调用UIDynamicBehavior的action closure后会出现memory leak/retain cycle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com