OC中
OC中的方法调用最终是走了消息派发机制。
函数派发的方式
静态派发(直接派发)
在编译期编译器就知道了某个函数的实现地址。
优点:高效。
缺点:缺乏动态性,不支持继承,无法实现多态。
动态派发
在运行期,编译器去查找某个函数的实现地址。
动态派发又包含了“函数表”和“消息派发”。
函数表派发
查找类中维护的一个函数表,在函数表中找到某个函数的实现地址。
速度比静态派发慢。
消息派发
OC中的消息机制(runtime中的消息机制)。
具有动态性,可以动态添加方法、动态替换方法的实现、方法转发。
swift中支持了以上所有的派发方式。
Struct、enum(值类型)
静态派发
类class
- 普通方法函数表派发
- dynamic修饰的方法使用消息派发(@objc修饰的方法只是暴露给了OC)
- extension中修饰的方法使用直接派发
NSObject子类
- 普通的实例方法使用函数表派发
- 对于override的OC方法使用消息派发
- dynamic修饰的方法使用消息派发
- extension中的普通方法使用直接派发
Protocol
- 普通方法使用函数表派发
- extension中的普通方法使用直接派发
协议可以为struct提供多态的支持
别人的图:
image.png
网友评论