[英]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.