Ios 以下swift代码的含义是什么?
有谁能告诉我为什么我们使用Ios 以下swift代码的含义是什么?,ios,swift,closures,weak-references,Ios,Swift,Closures,Weak References,有谁能告诉我为什么我们使用guard let self=self 我在阅读有关GCD的文章时看到了这段代码,我不知道这行代码的作用 DispatchQueue.global(qos: .userInitiated).async { [weak self] in guard let self = self else { return } // ... } 首先,创建一个将异步执行的块 DispatchQueue.global(qos: .userInit
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在块内声明为
弱
,以避免保留周期(),并且可以在执行块之前解除分配。这行代码检查self是否为!=nil,并将其分配给self,否则返回。异步{}中的代码将异步执行。完成函数({[weak self]…}
)包含对调用异步
函数的对象的(默认强)引用
因为它是异步的,所以您无法知道a)何时执行回调b)是否执行回调。这意味着对self
的强引用可能导致内存泄漏
这就是人们使用[弱自我]
传递弱引用的原因。由于调用是异步的,因此当回调最终执行时,ARC已经收集到对self
的引用,因此self
将是nil
然后,最好在执行回调中的代码之前检查
self
是否仍然存在。正在创建一个线程,并将其添加到全局队列中,该线程具有QOS(服务质量或可以说该线程的优先级)用户启动(中等优先级)在此之后,执行一组指令asyncself
在此块中被声明为弱
,因此它有一个可选
类型。例如,如果类的名称为MyViewController
,则该块中的self类型为MyViewController?
。使用弱循环的原因是为了避免保留循环。仅当self仍处于活动状态时,才应执行该块。因此,一个解决方案是:
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let strongSelf = self else {
return
}
strongSelf.makeFoo()
strongSelf.continueWithBar()
}
但是没有必要叫它strongSelf
。你也可以叫它self。guard
块后面的self
变量实际上是与self
不同的变量,它只是具有相同的名称
因此,其含义是:
仅当self
仍处于活动状态时才执行此块。(否则,什么也不做。)
您可以看到,此块使用[weak self]将self捕获为弱,因此现在self是可选的,可以在块内使用。那么你可以用它来做自我?要访问任何东西或在开始时使用guard let,并且可以在不使用的情况下作为自己使用?符号。可能重复的