OC中
OC中的方法調(diào)用最終是走了消息派發(fā)機(jī)制漓藕。
函數(shù)派發(fā)的方式
靜態(tài)派發(fā)(直接派發(fā))
在編譯期編譯器就知道了某個(gè)函數(shù)的實(shí)現(xiàn)地址。
優(yōu)點(diǎn):高效挟裂。
缺點(diǎn):缺乏動(dòng)態(tài)性享钞,不支持繼承,無(wú)法實(shí)現(xiàn)多態(tài)诀蓉。
動(dòng)態(tài)派發(fā)
在運(yùn)行期栗竖,編譯器去查找某個(gè)函數(shù)的實(shí)現(xiàn)地址。
動(dòng)態(tài)派發(fā)又包含了“函數(shù)表”和“消息派發(fā)”交排。
函數(shù)表派發(fā)
查找類中維護(hù)的一個(gè)函數(shù)表,在函數(shù)表中找到某個(gè)函數(shù)的實(shí)現(xiàn)地址饵筑。
速度比靜態(tài)派發(fā)慢埃篓。
消息派發(fā)
OC中的消息機(jī)制(runtime中的消息機(jī)制)。
具有動(dòng)態(tài)性根资,可以動(dòng)態(tài)添加方法架专、動(dòng)態(tài)替換方法的實(shí)現(xiàn)、方法轉(zhuǎn)發(fā)玄帕。
swift中支持了以上所有的派發(fā)方式部脚。
Struct、enum(值類型)
靜態(tài)派發(fā)
類class
- 普通方法函數(shù)表派發(fā)
- dynamic修飾的方法使用消息派發(fā)(@objc修飾的方法只是暴露給了OC)
- extension中修飾的方法使用直接派發(fā)
NSObject子類
- 普通的實(shí)例方法使用函數(shù)表派發(fā)
- 對(duì)于override的OC方法使用消息派發(fā)
- dynamic修飾的方法使用消息派發(fā)
- extension中的普通方法使用直接派發(fā)
Protocol
- 普通方法使用函數(shù)表派發(fā)
- extension中的普通方法使用直接派發(fā)
協(xié)議可以為struct提供多態(tài)的支持
別人的圖:
image.png