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.

我的问题是

  1. 什么时候或者什么情况下self可以为nil? 和
  2. 如果 self 为 nil,我认为它不会触发以下行(用于检查结果的那一行),因此 updateUI 函数和 presentGFAlert... 函数都不会被触发并且没有任何显示在屏幕上,对吧?

这是因为闭包定义它对self的引用是弱的,这意味着如果self被释放,块闭包将不会阻止self被破坏,引用计数为0 . 你可以在闭包的代码中处理这个问题,通过使用所有对 self 的引用作为 self?,但这意味着 self 可以在执行的中途变成 nil,通过使用 guard let self = self else { return },你是说如果执行到这里,我想要一个对它的强引用,这样该对象将继续可用,直到闭包的执行完成,基本上是全有或全无。这在过去只能发生在多线程应用程序中,但随着苹果新的异步线程模型使协作线程更加普遍,这更有可能发生。

您的担心是正确的。因为 getFollowers 是一个异步任务,用户可以在任务 运行 时返回到上一个屏幕。在那种情况下,self 可能是 nilreturn 没问题。

另一方面,为了确保 getFollowers 任务的完成块没有问题,self 将被捕获为 strong 引用,这可能会导致内存泄漏,即使用户已经离开该屏幕。 他使用 weak self 来防止这种情况发生。