【发布时间】:2022-02-07 12:28:51
【问题描述】:
我最近从Sean Allen's video 学到了如何使用Result 类型,我有了使用它的想法。但是,在我写代码的时候,有一行我看不懂。
图片中的行是87(或者这个->guard let self = self else { return })
起初,我只是在做和他一样的事情,但我想知道他为什么在代码中添加这行代码。我认为他写它是因为 self 可以为 nil,并且想确定 self 是否不为 nil,如果它为 nil,则从函数返回。
我的问题是
- 什么时候或者什么情况下 self 可以为零? 和
- 如果 self 为 nil,我认为它不会触发以下行(用于检查结果的行),因此不会触发 updateUI 函数和 presentGFAlert... 函数,并且不会显示任何内容屏幕,对吧?
【问题讨论】:
-
看
NetworkManager.shared.getFollowers这一行,它使用[weak self]。这意味着闭包不是没有持有对self的引用,因此您需要检查self是否仍然被分配或已成为nil。这允许在getFollowers仍在执行时取消引用“父”对象,但要防止它(即尝试在nil时引用self)并允许父对象在关闭之前超出范围被称为 -
1) 如果 self 被释放,它可以为 nil。 2) 结果关闭仍然会被触发,因为你的
NetworkManager是一个单例,即使在 self 被释放后它仍然存在。 -
一个真实的案例:您将该视图控制器呈现为模式,并希望使用 Web API。您的连接速度很慢,并决定在得到响应之前关闭控制器。闭包将在之后被调用,因此当 ViewController(此处为 self)可能已被释放时。使用
[weak self]防止内存泄漏。
标签: swift self guard resulttype