为啥在 UIViewPropertyAnimator 中使用“unowned”

Posted

技术标签:

【中文标题】为啥在 UIViewPropertyAnimator 中使用“unowned”【英文标题】:Why use 'unowned' in UIViewPropertyAnimator为什么在 UIViewPropertyAnimator 中使用“unowned” 【发布时间】:2016-12-16 19:42:24 【问题描述】:

所以我一直在阅读有关 UIViewPropertyAnimator 的信息,在我一直在查看的示例中,他们做了这样的事情:

animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeInOut, animations:  
        [unowned self, redBox] in
        redBox.center.x = self.view.frame.width
        redBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi).scaledBy(x: 0.001, y: 0.001)
    )

我不明白其中的 '[unowned self, redBox] in' 部分。谁能解释一下我们用它做什么?

我知道 unowned 通常用于决定如何确定引用计数,并且它不能设置为 nil,因为引用将不存在一个没有另一个(作为弱的替代),但我不了解这里的用法,括号部分我不了解。在我看来,它是正在制作动画的项目及其所在的视图的数组?

完整代码如下:

import UIKit

class ViewController: UIViewController 

    var animator: UIViewPropertyAnimator!

    override func viewDidLoad() 
        super.viewDidLoad()

        //redBox

        let redBox = UIView(frame: CGRect(x: 10, y: 100, width: 100, height: 100))
        redBox.translatesAutoresizingMaskIntoConstraints = false// lar oss redigere posisjon og sånn selv, uten at xcode setter posisjon/størrelse i stein.
        redBox.backgroundColor = .red
        redBox.center.y = view.center.y

        view.addSubview(redBox)

        animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeInOut, animations:  
            [unowned self, redBox] in
            redBox.center.x = self.view.frame.width
            redBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi).scaledBy(x: 0.001, y: 0.001)
        )

        // slider

        let slider = UISlider()
        slider.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(slider)
        slider.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        slider.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        slider.addTarget(self, action: #selector(sliderChanged), for: .valueChanged)

    
    func sliderChanged(_ sender: UISlider)
        animator.fractionComplete = CGFloat(sender.value)
    


【问题讨论】:

【参考方案1】:

    我们需要使用weakunowned 否则将创建所有权(引用)循环(self => animator => animations => self)。

    我们可以使用unowned 而不是weak,因为我们可以确定selfanimator 被一起销毁,并且当self 被释放时,动画将不再运行.

【讨论】:

好的,谢谢!你也知道这部分是什么吗?:“[unowned self, redBox] in” 它只是某种完成处理程序,其中包含我们正在使用的实例数组吗? @LordFresh 这不是一个数组,它被称为capture list。见developer.apple.com/library/content/documentation/Swift/…

以上是关于为啥在 UIViewPropertyAnimator 中使用“unowned”的主要内容,如果未能解决你的问题,请参考以下文章

为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?

为啥 + 仅在客户端是 NaN?为啥不在 Node.js 中?

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?

为啥我们不能在 TypeScript 类中定义一个 const 字段,为啥静态只读不起作用?

为啥这个函数序言中没有“sub rsp”指令,为啥函数参数存储在负 rbp 偏移处?