UIView.animate() :我是否需要在动画块中对 self 进行弱引用?

Ano*_*ude 9 animation uiview ios swift

经过一些研究,我发现我的应用程序使用了太多的能量,因为UIView整个应用程序中有几个动画,我在完成块中捕获了相关的动画UIViewController,而没有对其进行弱引用。

所以实际上,我改变了这一点:

func animate() {
    UIView.animate(withDuration: 0.3, animations: {
        self.label.alpha = 0.5
    }) { _ in 
        self.animate()
    }
}
Run Code Online (Sandbox Code Playgroud)

进入这个:

func animate() {
    UIView.animate(withDuration: 0.3, animations: {
        self.label.alpha = 0.5
    }) { [weak self] _ in 
        self?.animate()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想知道我是否需要对animation块(self.label.alpha = 0.5那个)做同样的事情?

感谢您的帮助

Cru*_*ruz 6

不,在这种情况下不需要。动画和完成不会自行保留,因此不存在强保留周期的风险。

重复是否有必要在 UIView.animateWithDuration(...) 的闭包中使用 [unowned self]?


Öme*_*ürk 5

您不需要[weak self]UIView.animate(). 当可以保留循环并且动画块不被自身保留时,您需要使用weak。

媒体上有一篇文章关于哪些地方[weak self]可能需要,哪些地方可能不需要

了解更多信息:

能源问题可能还有另一个问题。


Fat*_*tie -4

当然,你确实需要在那里使用“弱自我”的概念。

事实上,请注意:在这种情况下,VC 在动画过程中被丢弃确实很常见……所以事实上,这是您“最需要”使用弱自我想法的地方之一。在动画中忘记这一点是项目中非常常见的错误。

顺便说一下,当你需要弱自我时,这里有一个方便的语法:

func animate() {
    UIView.animate(withDuration: 0.3, animations: { [weak self] in
        guard let self = self else { return print("gotchya!") }
        self.label.alpha = 0.5
    }) { [weak self] in
        guard let self = self else { return print("gotchya!") }
        self.animate()
    }
}
Run Code Online (Sandbox Code Playgroud)

添加这一行..

        guard let self = self else { return }
Run Code Online (Sandbox Code Playgroud)

.. 看起来有点啰嗦,但是,这意味着您不需要“?” 每次在长块中使用“self”之后。

通常,在这样的块中,您会多次使用“self ...”,并且仅使用“let self = self”习惯用法似乎更一致。

在此输入图像描述

因此,即使块中只有一行代码(如您的两个示例中所示),这也是一种在各处绝对一致并保持简单的好方法。

请注意,每当您有一个时,{ return }您都可以添加一条打印语句,以便您知道开发过程中发生了什么。

.... { [weak self] in
  guard let self = self else { return print("I avoided a crash, woot!") }
Run Code Online (Sandbox Code Playgroud)

或者

.... { [weak self] in
  guard let self = self else { return print("logical disaster near line 66") }
Run Code Online (Sandbox Code Playgroud)

你不必这样做,“{ return }”就可以了。这只是为了您的方便。

这“自我=自我”到底是什么?

如果您发现“self = self”这个习语令人困惑……老实说,请不要担心。总是使用这个习语。这确实是随处可见的“标准”事物。

始终追求代码库的简单一致性!

更多弱小的自我之谜...

这是来自一位帅气名单成员的有趣问答:弱小的自我去哪儿了?

后来还需要担心这种混乱:弱引用和无主引用之间有什么区别?

  • 这个答案其实是**错误**!首先,“animations”闭包将立即运行,并且在动画期间不会被存储。我猜测“UIKit”将运行它来确定最终状态,然后丢弃它。其次,“completion”闭包将被**立即**调用,因为“VC 在动画期间被丢弃”,并且“finished”参数将为“false”。所以两个闭包都不需要“[weak self]”。另外,如果你想在“completion”中使用“[weak self]”来“如果 VC 被破坏,则不运行代码”,你可以只使用“!finished”。 (12认同)
  • 这个答案是目前接受的答案,这有点令人困惑。据我了解,在这种情况下,不需要“弱自我”来防止保留循环,这是最初的问题。然而,它可以用作控制流的手段。 (2认同)