为什么会出现内存泄漏/保留周期UIDynamicBehavior的行为闭调用后?

问题描述 投票:3回答:2

这里的代码的想法是删除一个视图(self.mv)时,它已经被UIDynamicAnimator动画出入画面。

下面的代码是基于从书编程的iOS 12由马特·诺伊堡第4章的例子。笔者认为这两种行为和(代码self.mv)的观点不会被取消分配。但他并没有对这个广泛阐述。

我的问题是:

  1. 谁仍然保留后self.anim.removeAllBehaviors()的行为?
  2. 谁仍然保留self.mv

我使用的仪器,但我不太明白输出。这是否意味着动画师保留呢?但也有唯一的绿色对号。

Instruments screen shot

随着在Xcode中“调试内存图”的工具,我看到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)

    }
}
swift memory-leaks uikit-dynamics uidynamicbehavior
2个回答
2
投票

你有:

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

0
投票

自拥有动画拥有GRAV拥有该动作框,其保留自我。

这是一个保留循环,因此自我的引用计数将永远不会被递减到零,所以自会泄漏。

你需要做的weakself舞解决这个问题。

{[weak self] in
  if let strongSelf = self {
    let items = strongSelf.anim.views(in: strongSelf.view.bounds)
    ...
© www.soinside.com 2019 - 2024. All rights reserved.