1.静态派发机制同时支持值类型和引用类型
然而,动态派发机制仅支持引用类型,比如Class,简而言之:对于动态性或者动态派发,我们需要用到继承特性,而这是值类型不支持的
首先全面了解一下,由4种派发机制,而不是两种(静态和动态)
1.内联(inline)(最快)
2.静态派发(Static Dispatch)
3.函数表派发(Virtual Dispatch)
4.动态派发(Dynamic Dispatch)(最慢)
由编译器决定应该使用哪种派发技术,当然有限选择内联函数,然后按需选择
静态派发VS动态派发
Objective-C默认支持动态派发,中华和钟派发技术以多态的形式为开发人员提供了灵活性,比如子类可以重写父类的方法,这很棒,然而这也是需要付出代价的
动态派发以一定量的运行时开销为代价,提高了语言的灵活性,这意味着,在动态派发机制下,对于每个方法的调用,编译器必须在方法列表中查找执行方法的实现,编译器需要判断调用方,是选择父类的实现,还是子类的实现,而且由于所有对象的内存都是在运行时分配的,因此编译只能在运行时执行检查,
而静态调用,则没有这个问题,在编译期的时候,编译器就知道要为某个方法调用某种实现,因此,编译器可以执行某些优化,甚至在可能的情况下,可以将某些代码转成inline函数,从而使整体执行速度异常快
2.如何在swift中实现动态派发和静态派发
->要实现动态派发,我们可以使用继承,重写父类的方法,另外我们可以使用dynamic关键字,并且需要在@objc关键字前面加上关键字,以便将方法公开给OC runtime使用
->要实现静态派发,我们可以使用final和static关键字,保证不会被覆盖