10、理解Swift中方法的派发机制_海森堡_lichangan的博客-CSDN博客_swift 方法派发
3种:直接派发,函数表派发,消息机制派发
直接派发:就是那种在编译时期就能确定函数的执行体的函数,比如final修饰的函数,private修饰的函数,extension里面的函数,结构体的函数,在编译的优化过程中,会将这些函数执行的地址内联起来提高cpu执行的效率
函数表派发:有多态性质的函数的调用机制,会将这些方法统一存放在对象的那个结构体当中,有一个属性指向函数表的地址,函数表是个数组,每一项存储的是函数的执行地址。
消息机制派发:oc的方法调用机制,跟isa有关 objc_mgsend吧啦吧啦。。
值得注意的是协议类型的函数派发机制:
protocol MyProtocol {
func teach()
}
extension MyProtocol{
func teach(){ print("MyProtocol") }
}
class MyClass: MyProtocol{
func teach(){ print("MyClass") }
}
let object: MyProtocol = MyClass()
object.teach()
let object1: MyClass = MyClass()
object1.teach()
//打印
//MyClass
//MyClass
protocol MyProtocol {
}
extension MyProtocol{
func teach(){ print("MyProtocol") }
}
class MyClass: MyProtocol{
func teach(){ print("MyClass") }
}
let object: MyProtocol = MyClass()
object.teach()
let object1: MyClass = MyClass()
object1.teach()
//打印
//MyProtocol
//MyClass
这是因为,swift是强类型语言,在编译的时候要确定类型,协议类型低层是extension container这样的一个存储结构,当协议里面没有声明某个方法,而是在extension里面声明的话,他就是直接派发机制,在编译的时候就确定了,不会再被继承者重写。