当然,你确实需要在那里使用“弱引用self”的概念。
事实上请注意:在动画过程中,VC通常会被清除...因此,在这种情况下,“最需要”使用弱引用self的地方之一。在项目中忘记在动画中使用它是一个非常常见的错误。
顺便说一下,在任何时候需要使用弱引用self的情况下,以下是一个方便的语法:
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" 的习惯似乎更加一致。
![enter image description here](https://istack.dev59.com/XSItJ.webp)
因此,即使代码块中只有一行代码(就像您的两个示例中一样),这也是确保在任何地方都绝对一致并保持简单的好方法。
请注意,每当您有一个{ 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" 这个习惯用法很困惑......老实说,别担心它。总是使用这个习惯用法。这真的只是你到处都会看到的 "标准" 东西。
在你的代码库中始终保持简单的一致性!
更多关于 weak self 的奥秘......
这里有一个来自一个英俊的列表成员的有趣问答:weak self 去哪里了?
后来还有这种困惑要担心:弱引用和无主引用之间有什么区别?