Swift 函數(shù)派發(fā)機制

4種派發(fā)機制:

1看锉、內(nèi)聯(lián)(inline)最快
2、靜態(tài)派發(fā)(Static Dispatch)
3斗蒋、函數(shù)表派發(fā)(Virtual Dispatch)
4煤惩、動態(tài)派發(fā)(Dynamic Dispatch)(最慢)

Swift 的派發(fā)方式總結(jié):

  1. 值類型 : 靜態(tài)派發(fā)
  2. final、擴展 :靜態(tài)派發(fā)
  3. 引用類型:函數(shù)表派發(fā)
  4. 協(xié)議 :函數(shù)表派發(fā)(單獨的函數(shù)表派發(fā))
  5. dynomic + @objc :走消息機制

dynamic 關鍵字可以用于修飾變量或函數(shù)猾浦,它的意思也與 Objective-C 完全不同陆错。它告訴編譯器使用動態(tài)分發(fā)而不是靜態(tài)分發(fā)灯抛。Objective-C 區(qū)別于其他語言的一個特點在于它的動態(tài)性,任何方法調(diào)用實際上都是消息分發(fā)音瓷,而 Swift 則盡可能做到靜態(tài)分發(fā)对嚼。
因此,標記為 dynamic 的變量或函數(shù)會隱式的加上 @objc 關鍵字绳慎,他會使用 Objective-C 的 runtime 機制纵竖。

@objc 修飾符:可以將 Swift 類型文件中的類、屬性和方法等偷线,暴露給Objective-C 類使用

swift中函數(shù)派發(fā)查看方式:可將swift代碼轉(zhuǎn)換為SIL(中間碼)

swiftc -emit-silgen -O example.swift

如何在Swift中使用動態(tài)派發(fā)和靜態(tài)派發(fā)磨确?

  1. 動態(tài)派發(fā)
  • 可以使用繼承,重寫父類的方法 -> 函數(shù)表派發(fā)
  • 使用dynamic + @objc声邦,方法公開給OC runtime使用 -> 消息機制

在這種類型的派發(fā)中乏奥,在運行時而不是編譯時選擇實現(xiàn)方法亥曹,會增加運行時的性能開銷邓了。

優(yōu)勢:具有靈活性(大多數(shù)的OOP語言都支持動態(tài)派發(fā),因為它允許多態(tài))

  1. 靜態(tài)派發(fā)
  • final 關鍵字
  • static 關鍵字

優(yōu)勢:和動態(tài)派發(fā)相比媳瞪,非称快。編譯器可以在編譯器定位到函數(shù)的位置蛇受。因此函數(shù)被調(diào)用時句葵,編譯器能通過函數(shù)的內(nèi)存地址,直接找到它的函數(shù)實現(xiàn)兢仰。極大的提高了性能乍丈,可以達到類型inline的編譯期優(yōu)化

動態(tài)派發(fā)有兩種形式:

  1. 函數(shù)表派發(fā)(Table Dispatch)

這種調(diào)用方式利用一個表,該表是一組函數(shù)指針把将,稱為witness table轻专,以查找特定方法的實現(xiàn)

  • witness table如何工作?

每個子類都有它自己的表結(jié)構(gòu)

對于類中每個重寫的方法察蹲,都有不同的函數(shù)指針

當子類添加新方法時请垛,這些方法指針會添加在表數(shù)組的末尾

最后,編譯器在運行時使用此表來查找調(diào)用函數(shù)的實現(xiàn)

由于編譯器必須從表中讀取方法實現(xiàn)的內(nèi)存地址洽议,然后跳轉(zhuǎn)到該地址宗收,一次它需兩條附加指令,因此它比靜態(tài)派發(fā)慢亚兄,但仍比消息派發(fā)快

  1. 消息派發(fā)(Message Dispatch)

這種動態(tài)派發(fā)方式是最動態(tài)的混稽。事實上它表現(xiàn)優(yōu)異,目前Cocoa框架在KVO,CoreData等很多地方在使用它

此外荚坞,它還可以使用method swizzling,可以在運行時更改函數(shù)的實現(xiàn)菲盾。

Swift本身不支持消息派發(fā)颓影,而是利用OC的runtime特性,間接實現(xiàn)這種動態(tài)性懒鉴。

要使用動態(tài)性需要使用dynamic關鍵字诡挂。Swift4.0之前,需要一起使用dynamic和@objc临谱。Swift4.0之后璃俗,只需表明@objc讓方法支持oc的調(diào)用,以支持消息派發(fā)

參考鏈接:http://www.reibang.com/p/6a0929424ac1
https://blog.csdn.net/LiqunZhang/article/details/115175965

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悉默,一起剝皮案震驚了整個濱河市城豁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抄课,老刑警劉巖唱星,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跟磨,居然都是意外死亡间聊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門抵拘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哎榴,“玉大人,你說我怎么就攤上這事僵蛛∩序颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵墩瞳,是天一觀的道長驼壶。 經(jīng)常有香客問我,道長喉酌,這世上最難降的妖魔是什么热凹? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮泪电,結(jié)果婚禮上般妙,老公的妹妹穿的比我還像新娘。我一直安慰自己相速,他們只是感情好碟渺,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著突诬,像睡著了一般苫拍。 火紅的嫁衣襯著肌膚如雪芜繁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天绒极,我揣著相機與錄音骏令,去河邊找鬼。 笑死垄提,一個胖子當著我的面吹牛榔袋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铡俐,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凰兑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了审丘?” 一聲冷哼從身側(cè)響起吏够,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎备恤,沒想到半個月后稿饰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡露泊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年喉镰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭笑。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侣姆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沉噩,到底是詐尸還是另有隱情捺宗,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布川蒙,位于F島的核電站蚜厉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畜眨。R本人自食惡果不足惜昼牛,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望康聂。 院中可真熱鬧贰健,春花似錦、人聲如沸恬汁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脊另,卻和暖如春导狡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偎痛。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工烘豌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人看彼。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像囚聚,于是被迫代替她去往敵國和親靖榕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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