Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以下swift代码的含义是什么?_Ios_Swift_Closures_Weak References - Fatal编程技术网

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(服务质量或可以说该线程的优先级)用户启动(中等优先级)在此之后,执行一组指令async

self
在此块中被声明为
,因此它有一个
可选
类型。例如,如果类的名称为
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,并且可以在不使用的情况下作为自己使用?符号。可能重复的