经过一些研究,我发现我的应用程序使用了太多的能量,因为整个应用程序中有几个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
一个)执行同样的操作?
谢谢你的帮助
当然,你确实需要用到“弱我”这个概念。
事实上注意:在这种情况下,一个风投在一个动画中被毁是非常常见的。。。所以,这确实是你“最需要”使用弱我这个想法的地方之一。 在动画片中忘记这一点是一个很常见的错误。
顺便说一下,这里有一个方便的语法,任何时候你都需要虚弱的自我:
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上有一篇文章是关于哪些地方可能需要[弱我]
,哪些地方可能不需要[弱我]
有关更多信息:
>
自动引用计数
闭包
能源问题可能还有另一个问题。