下面的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
。您也可以将其命名为 self
。 guard
块之后的 self
变量实际上与 self
是不同的变量,只是具有相同的名称。
所以意思是:
Execute this block only if self
is still alive. (Otherwise, do nothing.)
谁能告诉我为什么我们使用 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
以避免循环保留 (
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
。您也可以将其命名为 self
。 guard
块之后的 self
变量实际上与 self
是不同的变量,只是具有相同的名称。
所以意思是:
Execute this block only if
self
is still alive. (Otherwise, do nothing.)