经过一些研究,我发现我的应用程序使用了太多的能源,因为几个 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
一)?
谢谢你的帮助
当然,你 确需 以用 "弱小的自我 "概念在那里。
其实请注意:这的确是 很常见 在这种情况下,一个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()
}
}
加入这一行...
guard let self = self else { return }
......看起来有点啰嗦,但是,这意味着你不需要在 "self "后面加上"?",每次你在长块中使用它的时候。
通常你会在这样的区块里面有很多 "self...... "的用法,而只用 "让self=self "这个成语似乎更一致。
因此,即使块中只有一行代码(就像你的两个例子一样),这也是一个很好的方法,可以使各处的代码绝对一致,并保持简单。
注意,每当你有一个 { return }
你可以只添加一个打印声明,这样你就知道在开发过程中发生了什么...。
.... { [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 }"就可以了。只是为了方便你。
如果你觉得 "self = self "这个成语很混乱......老实说,你就别管它了。总是用这个成语。 这其实只是你随处可见的 "标准 "事物。
在你的代码库中,永远追求简单的一致性!
下面是一位帅榜成员的有趣QA。弱小的自己去哪里了?
后面还有这样的困惑要担心。弱者参照物和无主参照物的区别是什么?
什么叫无主参考?
我的应用耗费了太多的能量
我看不出保留一个人和一个人之间有什么直接的关系。weak
视图控制器上的参照物,节省能源。self
而不增加其在闭包中的保留次数(这就是我们所说的在对象上有一个弱引用的意思),这意味着如果你的视图控制器上没有其他的强引用存在,那么你的视图控制器将更快被释放。也许你会在短期内节省一些内存。
我建议你去别的地方调查一下,看看你的 "能量 "问题从何而来。
有很多文章都是关于使用 weak
关键字。
https:/medium.comflawless-app-storiesyou-dont-always-need-weak-self-a778bec505ef。
不,这种情况下不需要,动画和完成是不被自己保留的,所以不存在强保留周期的风险。