首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在调用UIDynamicBehavior的操作结束后存在内存泄漏/保留循环?

为什么在调用UIDynamicBehavior的操作结束后存在内存泄漏/保留循环?
EN

Stack Overflow用户
提问于 2019-02-02 14:15:05
回答 2查看 671关注 0票数 3

这里代码的思想是在视图(self.mv)被UIDynamicAnimator从屏幕外动画时移除它。

下面的代码基于Matt编写的“编程iOS 12”一书第4章中的示例。作者说,行为和视图(代码中的self.mv)都不会被取消分配。但他并没有详细阐述这一点。

我的问题是:

  1. 谁在self.anim.removeAllBehaviors()之后仍然保留这种行为?
  2. 谁还保留着self.mv

我用过仪器,但我不太懂输出。这是否意味着动画师保留了它?但只有绿色的标记。

使用XCode中的“调试内存图”工具,我看到UIGravityBehavior仍然被动画师保留,即使在调用self.anim.removeAllBehaviors()之后。

代码语言:javascript
复制
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)

    }
}
EN

回答 2

Stack Overflow用户

发布于 2019-02-05 21:56:26

你有:

代码语言:javascript
复制
var anim : UIDynamicAnimator!

如果你能做到:

代码语言:javascript
复制
var anim : UIDynamicAnimator?

当您完成动画时,在回调中nil它,这将修复您的额外保留:

代码语言:javascript
复制
        if idx == nil {
            self.anim?.removeAllBehaviors()
            self.mv!.removeFromSuperview()
            self.anim = nil // without this, the `MyView` is not deallocated.
        }
票数 1
EN

Stack Overflow用户

发布于 2019-02-02 16:17:43

自我拥有拥有格拉夫的阿尼姆,拥有保留自我的动作块。

这是一个retain循环,所以self的引用计数永远不会减少到零,所以self会泄漏。

你得跳个懦弱的舞蹈才能解决这个问题。

代码语言:javascript
复制
{[weak self] in
  if let strongSelf = self {
    let items = strongSelf.anim.views(in: strongSelf.view.bounds)
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54493876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档