UIView.animate() :我需要在动画块中对 self 进行弱引用吗?
UIView.animate() : do I need a weak reference to self in the animation block?
经过一些研究,我发现我的应用程序使用了过多的能量,因为整个应用程序中有几个 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
块)做同样的事情?
感谢您的帮助
当然,您确实需要在那里使用"weak self"概念。
事实上请注意:在那种情况下 非常常见 VC 在动画期间被丢弃......所以确实,它是其中一个地方你 "most need" 使用弱自我的想法。在动画中忘记这一点是项目中很常见的错误。
顺便说一句,当您需要弱化自我时,这里有一个方便的语法:
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 ...",并且只使用 "let 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"业务到底是什么?
如果您发现 "self = self" 习语令人困惑.......老实说,不要担心。总是使用那个成语。这真的只是随处可见的 "standard" 东西。
始终追求代码库的简单一致性!
更多弱小的自我谜团...
这是来自一位帅气的名单成员的有趣 QA:
后来还有这种混乱需要担心:What is the difference between a weak reference and an unowned reference?
你是什么意思:
my app was using way too much energy
我看不出在视图控制器上保留 weak
引用与节能之间有任何直接关系。
捕获 self
而不增加它在你的闭包中的保留计数(这就是我们对对象的弱引用的意思)意味着如果你的视图控制器上不存在其他强引用,那么你的视图控制器将更快被释放。也许你会在很短的时间内节省一些内存。
我建议调查其他地方以找出您的 "energy" 问题的来源。
有很多文章介绍weak
关键字的使用。
https://medium.com/flawless-app-stories/you-dont-always-need-weak-self-a778bec505ef
你不需要在静态函数中使用[weak self]
UIView.animate()
你需要使用weak当retain cycle是可能的并且动画块不被自己保留时
媒体上有一个 article 关于可能需要也可能不需要的地方 [weak self]
更多信息:
能源问题可能还有其他问题。
不,在这种情况下不需要。动画和完成不会自行保留,因此不存在强保留周期的风险。
与 Is it necessary to use [unowned self] in closures of UIView.animateWithDuration(...)?
重复
经过一些研究,我发现我的应用程序使用了过多的能量,因为整个应用程序中有几个 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
块)做同样的事情?
感谢您的帮助
当然,您确实需要在那里使用"weak self"概念。
事实上请注意:在那种情况下 非常常见 VC 在动画期间被丢弃......所以确实,它是其中一个地方你 "most need" 使用弱自我的想法。在动画中忘记这一点是项目中很常见的错误。
顺便说一句,当您需要弱化自我时,这里有一个方便的语法:
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 ...",并且只使用 "let 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"业务到底是什么?
如果您发现 "self = self" 习语令人困惑.......老实说,不要担心。总是使用那个成语。这真的只是随处可见的 "standard" 东西。
始终追求代码库的简单一致性!
更多弱小的自我谜团...
这是来自一位帅气的名单成员的有趣 QA:
后来还有这种混乱需要担心:What is the difference between a weak reference and an unowned reference?
你是什么意思:
my app was using way too much energy
我看不出在视图控制器上保留 weak
引用与节能之间有任何直接关系。
捕获 self
而不增加它在你的闭包中的保留计数(这就是我们对对象的弱引用的意思)意味着如果你的视图控制器上不存在其他强引用,那么你的视图控制器将更快被释放。也许你会在很短的时间内节省一些内存。
我建议调查其他地方以找出您的 "energy" 问题的来源。
有很多文章介绍weak
关键字的使用。
https://medium.com/flawless-app-stories/you-dont-always-need-weak-self-a778bec505ef
你不需要在静态函数中使用[weak self]
UIView.animate()
你需要使用weak当retain cycle是可能的并且动画块不被自己保留时
媒体上有一个 article 关于可能需要也可能不需要的地方 [weak self]
更多信息:
能源问题可能还有其他问题。
不,在这种情况下不需要。动画和完成不会自行保留,因此不存在强保留周期的风险。
与 Is it necessary to use [unowned self] in closures of UIView.animateWithDuration(...)?
重复