下面的swift代码是什么意思?

What is the meaning of following swift code?

谁能告诉我为什么我们使用 guard let self = self ??

我在阅读有关 GCD 的文章时看到了这段代码,但我无法弄清楚那一行的作用。

DispatchQueue.global(qos: .userInitiated).async { [weak self] in
    guard let self = self else {
        return
    }

    // ...
}

首先,您要创建一个将异步执行的块

DispatchQueue.global(qos: .userInitiated).async

然后在代码块内部检查调用此函数的对象 self 是否仍然分配

guard let self = self else {
  return
}

我们需要检查这一点,因为 self 在块内被声明为 weak 以避免循环保留 (),并且可以在执行块之前释放。该行代码检查 self 是否为 != nil,并将其赋值给 self,否则为 returns.

async {} 中的代码将异步执行。完成函数 ({ [weak self] ... }) 包含对调用 async 函数的对象的(默认强)引用。

由于它是异步的,因此您无法知道 a) 何时执行回调 b) 是否执行回调。这意味着对 self 的强引用可能会导致内存泄漏。

这就是为什么要使用 [weak self] 来传递弱引用。由于调用是异步的,因此可能是,当最终执行回调时,ARC 已经收集了对 self 的引用,因此 self 将是 nil.

然后在执行回调中的代码之前检查 self 是否仍然存在是很好的。

正在创建一个线程并将其添加到全局队列中,并且在您执行异步指令集之后具有用户启动的 QOS(服务质量或者您可以说该线程的优先级)(中等优先级)

self 在此块中声明为 weak,因此它具有 Optional 类型。例如。如果您的 class 的名称是 MyViewController,那么该块中的自我类型是 MyViewController?。使用 weak 的原因是为了避免保留循环。该块应该仅在 self 仍然存在时执行。所以一种解决方案是:

DispatchQueue.global(qos: .userInitiated).async { [weak self] in
    guard let strongSelf = self else {
        return
    }
    strongSelf.makeFoo()
    strongSelf.continueWithBar()
}

但没必要叫它strongSelf。您也可以将其命名为 selfguard 块之后的 self 变量实际上与 self 是不同的变量,只是具有相同的名称。

所以意思是:

Execute this block only if self is still alive. (Otherwise, do nothing.)