簡體   English   中英

快速代碼的含義是什么?

[英]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 ,以避免保留周期( Swift閉包導致self產生強保留周期 ),並且可以在執行塊之前將其釋放。 該行代碼檢查self是否為!= nil,並將其分配給self,否則返回。

在此塊中將self聲明為weak ,因此它具有Optional類型。 例如,如果您的類的名稱是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仍然存在時才執行此塊。 (否則,什么也不做。)

async {}內部的代碼將異步執行。 完成函數( { [weak self] ... } )包含對調用async函數的對象的引用(默認為強)。

由於它是異步的,因此您無法知道a)何時執行回調b)是否將執行回調。 這意味着強烈引用self可能導致內存泄漏。

這就是為什么人們使用[weak self]傳遞弱參考。 由於調用是異步的,因此可能是,當最終執行回調時,ARC已經收集了對self的引用,因此self將為nil

在執行回調中的代碼之前,最好檢查一下self仍然存在。

正在執行異步指令集之后,正在創建一個線程並將其添加到全局隊列中,並具有用戶啟動的QOS(服務質量或您可以說該線程的優先級)(中等優先級)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM