Ios 为什么不在动画块中使用弱模式?

Ios 为什么不在动画块中使用弱模式?,ios,swift,uikit,Ios,Swift,Uikit,我知道在动画中已经有一些关于弱的问题被问到了,比如在后一种情况下,你可以忽略弱,但我仍然很难理解为什么我不应该在旋转视图中使用弱模式。我不想打扰那里的评论,所以我在这里问这个问题 有问题的代码是 private func createAnimation(){ animator=UIViewPropertyAnimator.runningPropertyAnimator(持续时间:4,延迟:0,选项:.curveLinear){[self]在 UIView.animateKeyframes(持续时

我知道在动画中已经有一些关于
的问题被问到了,比如在后一种情况下,你可以忽略
,但我仍然很难理解为什么我不应该在旋转视图中使用
模式。我不想打扰那里的评论,所以我在这里问这个问题

有问题的代码是

private func createAnimation(){
animator=UIViewPropertyAnimator.runningPropertyAnimator(持续时间:4,延迟:0,选项:.curveLinear){[self]在
UIView.animateKeyframes(持续时间:4,延迟:0){
UIView.addKeyframe(使用RelativeStartTime:0,RelativeEduration:1.0/3.0){
animatedView.transform=.init(旋转角度:.pi*2*1/3)
}
...
}
}完成:{[弱自]\uuIn
self?.createAnimation()
}
}
Rob在
完成
-闭包中使用了
[弱自我]
,但在
动画
-闭包中没有使用,他实际上将
自我
放入了捕获列表中,以使他的意图显而易见。我怎么知道,
UIViewPropertyAnimator.runningPropertyAnimator
永远不会将(转义)
动画
-闭包放入已创建的
动画
-实例变量中

我不认为,
UIViewPropertyAnimator.runningPropertyAnimator
实际上捕获了
animations
-闭包,但只要我不知道,
UIViewPropertyAnimator.runningPropertyAnimator
是如何实现的,或者将来将如何实现,我怎么能确定呢

也许这个伪实现有助于解释我的意思:

<代码>导入基础 类UIView{ var transform=CGFloat.zero 静态函数animateKeyFrames(动画:()->Void){} 静态func addKeyframe(动画:()->Void){} } 类UIViewPropertyAnimator{ 变量动画:()->Void={} 变量完成:(()->Void)?={} 静态函数runningPropertyAnimator(动画:@escaping()->Void, 完成:(()->Void)?)->UIViewPropertyAnimator{ 让animator=UIViewPropertyAnimator() animator.animations=动画 animator.completion=完成 返回动画师 } } 类视图控制器{ var animator:UIViewPropertyAnimator? 让animatedView=UIView() func viewDidLoad(){ createAnimation() } func createAnimation(){ animator=UIViewPropertyAnimator.runningPropertyAnimator(动画:{[weak self]在中) UIView.animateKeyFrames(动画:{ UIView.addKeyframe(动画:{ self?.animatedView.transform=.zero }) }) },完成:{[weak self]in self?.animatedView.transform=.zero }) } 脱硝{ 印刷品(“脱硝”) } } func createAndRelease(){ 让viewController=viewController() viewController.viewDidLoad() } createAndRelease()
动画
完成
中删除
[弱自我]
-关闭显然会在我的伪代码中导致一个保留周期,并且永远不会调用
deinit

基于关闭的动画API有两个关闭,动画关闭(在动画开始时调用,然后释放)以及(可选)完成处理程序闭包(动画完成时调用)

考虑:

类ViewController:UIViewController{
var animator:UIViewPropertyAnimator?
覆盖函数视图显示(u动画:Bool){
super.viewdide显示(动画)
让子视图=UIView(帧:CGRect(x:100,y:100,宽度:100,高度:100))
subview.backgroundColor=.red
view.addSubview(子视图)
调试(“创建动画师”)
animator=.runningPropertyAnimator(持续时间:1,延迟:1){
debug(“调用动画闭包”)
subview.frame=CGRect(x:100,y:200,宽度:100,高度:100)
}完成:{位置在
debug(“调用完成关闭”)
}
}
}
这将产生:

2021-03-31 16:08:00.384558-0700 MyApp[3837:8759577] [ViewController] creating animator 2021-03-31 16:08:00.384899-0700 MyApp[3837:8759577] [ViewController] animate closure called 2021-03-31 16:08:02.386253-0700 MyApp[3837:8759577] [ViewController] completion closure called 这显然不是
UIViewPropertyAnimator
正在做的事情,但要理解的是,一旦调用闭包并使用闭包,它就会释放其强引用。这既适用于
动画
闭包,也适用于
完成
闭包(后者显然要晚一点发布)


另外,这是一个很好的模式,可以在自己的基于闭包的代码中遵循。如果在某些属性中保存闭包,请确保(a)将其设置为可选;和(b)
nil
完成闭包后立即删除该属性


这是一种防御性编程模式,如果应用程序开发人员意外地引入了他们不应该有的强引用,可以减轻损害。

UIView.animate的情况与UIViewPropertyAnimator的情况不同,因为您可能会保留UIViewPropertyAnimator。当然,您的伪代码看起来更真实,而且所有测试都表明
UIViewPropertyAnimator
不会使
动画
-closure保持活动状态。但我真的能百分之百确定吗
UIViewPropertyAnimator
对我来说就像一个黑盒子。我既不是假设动画师存储并保留
动画
-闭包的引用,也不是假设他永远不会这样做。我的想法是:我只是不确定。纯粹的可能性是,
UIViewPropertyAnimator
可以保留
动画的引用
-闭包会促使我使用