逃逸(escaping)/非逃逸(noescape)閉包清單

本文是自己的加深理解和記憶的筆記挂滓,非原創(chuàng)。按照自己的理解習(xí)慣改寫了其他文章的內(nèi)容(引用資料在最下方)姻灶,看看就好铛绰,最后強(qiáng)調(diào)一次,非原創(chuàng)产喉。

[TOC]

1. 什么是逃逸閉包捂掰?如何標(biāo)記?

A closure is said to escape a function when the closure is passed as an argument to the function, but is called after the function returns. When you declare a function that takes a closure as one of its parameters, you can write @escaping before the parameter’s type to indicate that the closure is allowed to escape.

即:作為一個(gè)傳入?yún)?shù)曾沈,若該閉包在函數(shù)返回后才被執(zhí)行的話这嚣,則該閉包就是在逃逸函數(shù)。(這樣的閉包就是逃逸閉包塞俱。)你需要在參數(shù)前加上@escaping標(biāo)記來(lái)表明閉包是逃逸的姐帚。

2. 什么情況下使用逃逸閉包標(biāo)記?

  • 函數(shù)外存儲(chǔ)

    如果一個(gè)函數(shù)參數(shù)可能導(dǎo)致引用循環(huán)障涯,那么它需要被顯示地標(biāo)記出來(lái)罐旗。@escaping標(biāo)記可以作為一個(gè)警告膳汪,來(lái)提醒使用這個(gè)函數(shù)的開發(fā)者注意引用關(guān)系。

    舉個(gè)例子九秀。此時(shí)的callbackself所持有遗嗽,典型的可能在函數(shù)return之后被執(zhí)行。

    class SomeClass {
        var callback:(()->Void)?
        func doSomething(callback:@escaping ()->Void) { // 加上逃逸修飾詞
            self.callback = callback  
       }
    }
    
  • 異步調(diào)用

    同理鼓蜒,如果閉包被放進(jìn)async dispatch queue痹换,則該閉包也會(huì)被queue retain,同樣可能在函式結(jié)束后才被執(zhí)行友酱,因此也算是“逃逸”

    舉個(gè)例子晴音。此時(shí)的callback被異步調(diào)用了

    class SomeClass {
        func doWorkAsync(block: @escaping () -> ()) { // 加上逃逸修飾詞
            DispatchQueue.main.async {
                block() 
            }
        }
    }
    

3. 非逃逸閉包有什么限制

  • 不能在函式外儲(chǔ)存

  • 不能進(jìn)async dispatch queue

  • 不能作為其他逃逸閉包函數(shù)的參數(shù)

    把@noescape閉包傳到其他@noescape參數(shù)是可以的,一連串不會(huì)逃逸的傳值缔杉,最終還是不會(huì)逃逸(下面的@noescape會(huì)被編譯器提示刪除,因?yàn)閟wift3開始默認(rèn)的就是非逃逸閉包)

    class SomeClass {
        func foo( code:@noescape (() -> String)) -> String {
            return bar(code: code)
        }
        func bar( code:@noescape (() -> String)) -> String {
            return code()
        }
    }
    

4.其他:

  • 從swift3開始搁料,閉包默認(rèn)為非逃逸閉包或详。之前則相反,且使用@noescape進(jìn)行標(biāo)記(此標(biāo)記已廢棄)郭计。

  • 非逃逸閉包可用被編譯器高度優(yōu)化霸琴,快速的執(zhí)行路徑將被作為基準(zhǔn)而使用,除非你在有需要的時(shí)候顯式地使用其他方法昭伸。

  • 和弱引用關(guān)系:非逃逸閉包中可放心使用self關(guān)鍵字梧乘,因?yàn)椴粫?huì)在函數(shù)外儲(chǔ)存,也不會(huì)被異步調(diào)用庐杨。你不需要去使用一個(gè)弱引用(weak或unowned)去引用self选调。

  • 在函數(shù)內(nèi)部?jī)?chǔ)存閉包也會(huì)被識(shí)別成逃逸,雖然并不會(huì)(現(xiàn)在的最新swift4仍存在這個(gè)問(wèn)題)

    func doSomething(callback:(()->Void) {
        let c = callback // error: non-escaping parameter 'callback' may only be called
        c()
    }
    

引用資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灵份,一起剝皮案震驚了整個(gè)濱河市仁堪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌填渠,老刑警劉巖弦聂,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氛什,居然都是意外死亡莺葫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門枪眉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捺檬,“玉大人,你說(shuō)我怎么就攤上這事瑰谜∑奂剑” “怎么了树绩?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)隐轩。 經(jīng)常有香客問(wèn)我饺饭,道長(zhǎng),這世上最難降的妖魔是什么职车? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任瘫俊,我火速辦了婚禮,結(jié)果婚禮上悴灵,老公的妹妹穿的比我還像新娘扛芽。我一直安慰自己,他們只是感情好积瞒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布川尖。 她就那樣靜靜地躺著,像睡著了一般茫孔。 火紅的嫁衣襯著肌膚如雪叮喳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天缰贝,我揣著相機(jī)與錄音馍悟,去河邊找鬼。 笑死剩晴,一個(gè)胖子當(dāng)著我的面吹牛锣咒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赞弥,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼毅整,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嗤攻?” 一聲冷哼從身側(cè)響起毛嫉,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妇菱,沒(méi)想到半個(gè)月后承粤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闯团,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年辛臊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房交。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻舰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刃唤,我是刑警寧澤隔心,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站尚胞,受9級(jí)特大地震影響硬霍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笼裳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一唯卖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躬柬,春花似錦拜轨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颠锉,卻和暖如春堪嫂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背木柬。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淹办,地道東北人眉枕。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怜森,于是被迫代替她去往敵國(guó)和親速挑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354