Swift - @escaping關鍵字

這個寫了不知道多少遍的東西后邊寫著寫著就不知道為什么寫了. 而且有時候完全依靠編譯器的提醒使用補全功能添加.

其實它是一個非常簡單的概念

If a closure is passed as an argument to a function and it is invoked after the function returns, the closure is escaping.

如果一個閉包作為函數(shù)的參數(shù), 并且在這個函數(shù)執(zhí)行完畢之前沒有執(zhí)行, 這個閉包就是逃逸閉包

我們大部分時候使用閉包作為參數(shù)的目的一般主要是異步回調(diào), 這種情況肯定是在這個函數(shù)的作用域之外的(不然就是一個同步執(zhí)行的閉包)

所以這個標識的意思就是,"注意! 我這個閉包不確定什么時候要調(diào)用, 為了我調(diào)用時候能夠正確執(zhí)行, 我要捕獲閉包里用到的變量了!"

反之, 如果一個閉包參數(shù)并沒有被@escaping標識, 它其實是不會捕獲外部變量, 也不需要弱引用修飾對應變量.

比如

func fetchSomeData(_ completion: () -> Void) {
    completion()
}

override func viewDidLoad() {
    super.viewDidLoad()
      fetchSomeData {
        print(title) // Don't need `self`.title
      }
}

這是一個無意義的示例. 但我們應該注意到了平常用的map filter函數(shù)都不需要內(nèi)部顯式self 它們都是同步的不捕獲任何變量的閉包

結論

編譯器會根據(jù)這個修飾符對閉包以及內(nèi)部變量做出不一樣的內(nèi)存管理. 我們也應該意識到其中的區(qū)別來做出不同的處理. 無腦加weak 并不是我們想要的.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 以下翻譯自Apple官方文檔,結合自己的理解記錄下來。翻譯基于 swift 3.0.1 原文地址 Closure...
    藝術農(nóng)閱讀 1,712評論 0 3
  • 86.復合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開。如果任何模式...
    無灃閱讀 1,556評論 1 5
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,143評論 2 9
  • 南充是個快速發(fā)展的城市。 去年年底我離開了這個城市,那時的西華路、濱江路等地還在進行著大規(guī)模地下管網(wǎng)的改造。 今年...
    劉愛國閱讀 1,253評論 0 3
  • 午夜半醉撫窗憑,笑看滴雨寒勝冰。 輕惹指間存涼意,是夢是醒是真情。
    寒菊閱讀 262評論 0 1

友情鏈接更多精彩內(nèi)容