提问者:小点点

animate():我需要在动画块中弱引用self吗?


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

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

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

变成这个:

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

但是,我想知道是否需要对animation块(self.label.alpha=0.5一个)执行同样的操作?

谢谢你的帮助


共3个答案

匿名用户

当然,你确实需要用到“弱我”这个概念。

事实上注意:在这种情况下,一个风投在一个动画中被毁是非常常见的。。。所以,这确实是你“最需要”使用弱我这个想法的地方之一。 在动画片中忘记这一点是一个很常见的错误。

顺便说一下,这里有一个方便的语法,任何时候你都需要虚弱的自我:

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()
    }
}

正在添加此行。。

        guard let self = self else { return }

我。。。看起来有点长篇大论,但是,这意味着你不需要“?” 在“self”之后,每次你在长长的方块中使用它。

在这样的一个块中,通常你会有许多“self.。。”的用法,而仅仅使用“让self=self”这个成语似乎更一致。

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

请注意,每当您有{return}时,您只需添加一个print语句,就可以知道在开发过程中发生了什么。

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

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

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

如果你觉得“自我=自我”这个成语让人摸不着头脑。。。。。。。 老实说,别担心。 总是用那个成语。 它真的只是你随处可见的“标准”东西。

在代码库中始终保持简单的一致性!

下面是一位帅气的榜单成员给出的一个有趣的QA:弱小的自我走向何方?

随后,就会出现这样的困惑:弱引用和无主引用之间的区别是什么?

匿名用户

你的意思是:

我的应用程序耗能太多了

我看不出在视图控制器上保持引用与节省能源之间有任何直接关系。 捕获self而不增加闭包中的保留计数(这就是我们所说的对象上的弱引用)意味着,如果视图控制器上不存在其他强引用,那么视图控制器将更早释放。 也许你会在很短的时间内节省一些RAM。

我会建议去别的地方调查一下,看看你的“能量”问题是从哪里来的。

关于关键字的使用有很多文章。

https://medium.com/flawless-app-stories/you-dont-always-need-weak-self-A778BEC505EF

匿名用户

您不需要在静态函数uiview.animate()中使用[weak self]您需要使用weak当保留循环是可能的并且动画块不被自己保留时。

medium上有一篇文章是关于哪些地方可能需要[弱我],哪些地方可能不需要[弱我]

有关更多信息:

>

  • 自动引用计数

    闭包

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