Swift 逃逸閉包

非逃逸閉包
非逃逸閉包的生命周期:

  1. 把閉包作為參數(shù)傳遞給函數(shù)。
  2. 函數(shù)中運行該閉包余掖。
  3. 退出函數(shù)鲫凶。

非逃逸閉包被限制在函數(shù)內(nèi)禀崖,當(dāng)函數(shù)退出時,該閉包的引用計數(shù)不會增加螟炫,也就是說其引用計數(shù)在進入函數(shù)和退出函數(shù)時保持不變波附。

逃逸閉包

  1. 閉包作為參數(shù)傳遞給函數(shù);
  2. 退出函數(shù)昼钻;
  3. 閉包被調(diào)用掸屡,閉包生命周期結(jié)束

閉包參數(shù)默認是非逃逸類型。如果需要其逃逸類型的閉包然评,可以使用關(guān)鍵字@escaping

舉個例子我們常用的Masonry或者SnapKit的添加約束的方法就是非逃逸的仅财。因為這閉包馬上就執(zhí)行了。
比如這個Alamofire里的處理返回json的completionHandler閉包就是逃逸的碗淌,網(wǎng)絡(luò)請求結(jié)束后的回調(diào)的閉包是逃逸的盏求,因為發(fā)起請求后過了一段時間后這個閉包才執(zhí)行。

//這是一個非逃逸閉包亿眠,閉包closure 在函數(shù)執(zhí)行的時候就調(diào)用了 
func callAction(closure:(() -> Void)) {
    closure()
}

//這是一個逃逸閉包碎罚,閉包closure 到了另一個作用域,跟當(dāng)前函數(shù)是異步的,逃逸閉包必須用@escaping來修飾纳像。因為默認是 @noescaping
func callAction(closure:@escaping (() -> Void)) {
    DispatchQueue.main.async {
        closure()
    }
}

逃逸閉包使用場景
異步調(diào)用:如果需要調(diào)度隊列中異步調(diào)用閉包荆烈,這個隊列會持有閉包的引用,至于什么時候調(diào)用閉包竟趾,或者閉包什么時候運行結(jié)束都是不可預(yù)知的憔购。
存儲:需要存儲閉包作為屬性,全局變量或者其他類型做稍后使用。

為什么要分逃逸閉包和非逃逸閉包
為了管理內(nèi)存,閉包會強引用它捕獲的所有對象梢卸,比如你在閉包中訪問了當(dāng)前控制器的屬性、函數(shù)鞋邑,編譯器會要求你在閉包中顯示 self 的引用诵次,這樣閉包會持有當(dāng)前對象,容易導(dǎo)致循環(huán)引用枚碗。

非逃逸閉包不會產(chǎn)生循環(huán)引用逾一,它會在函數(shù)作用域內(nèi)釋放,編譯器可以保證在函數(shù)結(jié)束時閉包會釋放它捕獲的所有對象肮雨;使用非逃逸閉包的另一個好處是編譯器可以應(yīng)用更多強有力的性能優(yōu)化遵堵,例如,當(dāng)明確了一個閉包的生命周期的話怨规,就可以省去一些保留(retain)和釋放(release)的調(diào)用陌宿;此外非逃逸閉包它的上下文的內(nèi)存可以保存在棧上而不是堆上。

綜上所述波丰,如果沒有特別需要壳坪,開發(fā)中使用非逃逸閉包是有利于內(nèi)存優(yōu)化的,所以蘋果把閉包區(qū)分為兩種掰烟,特殊情況時再使用逃逸閉包爽蝴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纫骑,隨后出現(xiàn)的幾起案子蝎亚,更是在濱河造成了極大的恐慌,老刑警劉巖先馆,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件发框,死亡現(xiàn)場離奇詭異,居然都是意外死亡煤墙,警方通過查閱死者的電腦和手機梅惯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仿野,“玉大人个唧,你說我怎么就攤上這事∩柙ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵犁河,是天一觀的道長鳖枕。 經(jīng)常有香客問我,道長桨螺,這世上最難降的妖魔是什么宾符? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮灭翔,結(jié)果婚禮上魏烫,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好哄褒,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布稀蟋。 她就那樣靜靜地躺著,像睡著了一般呐赡。 火紅的嫁衣襯著肌膚如雪退客。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天链嘀,我揣著相機與錄音萌狂,去河邊找鬼。 笑死怀泊,一個胖子當(dāng)著我的面吹牛茫藏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霹琼,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼务傲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碧囊?” 一聲冷哼從身側(cè)響起树灶,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糯而,沒想到半個月后天通,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡熄驼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年像寒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓜贾。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡诺祸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭芦,到底是詐尸還是另有隱情筷笨,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布龟劲,位于F島的核電站胃夏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昌跌。R本人自食惡果不足惜仰禀,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚕愤。 院中可真熱鬧答恶,春花似錦饺蚊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烫扼,卻和暖如春曙求,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背映企。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工悟狱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堰氓。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓挤渐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親双絮。 傳聞我的和親對象是個殘疾皇子浴麻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容