guard let self = self else { return } 的用法是什么
What is the usage of guard let self = self else { return }
我最近刚从Sean Allen's video那里学会了如何使用Result类型,我有了使用它的想法。但是,我在写代码的时候,有一行我没看懂。
图中的线是87(或者这个 -> guard let self = self else { return }
)
起初,我只是和他做同样的事情,但我想知道他为什么要在代码中添加这一行。我认为他写它是因为 self 可以为 nil 并且想确定 self 是否不为 nil 并且 return 如果函数为 nil.
我的问题是
- 什么时候或者什么情况下self可以为nil?
和
- 如果 self 为 nil,我认为它不会触发以下行(用于检查结果的那一行),因此 updateUI 函数和 presentGFAlert... 函数都不会被触发并且没有任何显示在屏幕上,对吧?
这是因为闭包定义它对self
的引用是弱的,这意味着如果self
被释放,块闭包将不会阻止self被破坏,引用计数为0 . 你可以在闭包的代码中处理这个问题,通过使用所有对 self 的引用作为 self?,但这意味着 self 可以在执行的中途变成 nil
,通过使用 guard let self = self else { return }
,你是说如果执行到这里,我想要一个对它的强引用,这样该对象将继续可用,直到闭包的执行完成,基本上是全有或全无。这在过去只能发生在多线程应用程序中,但随着苹果新的异步线程模型使协作线程更加普遍,这更有可能发生。
您的担心是正确的。因为 getFollowers
是一个异步任务,用户可以在任务 运行 时返回到上一个屏幕。在那种情况下,self
可能是 nil
而 return
没问题。
另一方面,为了确保 getFollowers
任务的完成块没有问题,self
将被捕获为 strong
引用,这可能会导致内存泄漏,即使用户已经离开该屏幕。
他使用 weak self
来防止这种情况发生。
我最近刚从Sean Allen's video那里学会了如何使用Result类型,我有了使用它的想法。但是,我在写代码的时候,有一行我没看懂。
图中的线是87(或者这个 -> guard let self = self else { return }
)
起初,我只是和他做同样的事情,但我想知道他为什么要在代码中添加这一行。我认为他写它是因为 self 可以为 nil 并且想确定 self 是否不为 nil 并且 return 如果函数为 nil.
我的问题是
- 什么时候或者什么情况下self可以为nil? 和
- 如果 self 为 nil,我认为它不会触发以下行(用于检查结果的那一行),因此 updateUI 函数和 presentGFAlert... 函数都不会被触发并且没有任何显示在屏幕上,对吧?
这是因为闭包定义它对self
的引用是弱的,这意味着如果self
被释放,块闭包将不会阻止self被破坏,引用计数为0 . 你可以在闭包的代码中处理这个问题,通过使用所有对 self 的引用作为 self?,但这意味着 self 可以在执行的中途变成 nil
,通过使用 guard let self = self else { return }
,你是说如果执行到这里,我想要一个对它的强引用,这样该对象将继续可用,直到闭包的执行完成,基本上是全有或全无。这在过去只能发生在多线程应用程序中,但随着苹果新的异步线程模型使协作线程更加普遍,这更有可能发生。
您的担心是正确的。因为 getFollowers
是一个异步任务,用户可以在任务 运行 时返回到上一个屏幕。在那种情况下,self
可能是 nil
而 return
没问题。
另一方面,为了确保 getFollowers
任务的完成块没有问题,self
将被捕获为 strong
引用,这可能会导致内存泄漏,即使用户已经离开该屏幕。
他使用 weak self
来防止这种情况发生。