与C ++不同,不必在Swift中指定方法是虚拟的。编译器将计算出要使用以下哪个:
(性能指标当然取决于硬件)
- 内联方法:0 ns
- 静态调度:<1.1ns
- 虚拟调度1.1ns(指定时类似于Java,C#或C ++)。
- 动态分配4.9ns(如Objective-C)。
当然,Objective-C始终使用后者。4.9ns的开销通常不是问题,因为这只占整个方法执行时间的一小部分。但是,必要时开发人员可以无缝地回退到C或C
++。但是,在Swift中,编译器将分析可以使用最快的哪个,并尝试代表您进行决策,支持内联,静态和虚拟,但保留用于Objective-
C互操作性的消息传递。可以标记一种
dynamic鼓励消息传递的方法。
这样做的一个副作用是,动态分配所提供的某些强大功能可能不可用,因为以前假定任何Objective-
C方法都是这种情况。动态分派用于方法拦截,依次由以下人员使用:
- 可可风格的财产观察员。
- CoreData模型对象检测。
- 面向方面的编程
以上是
latebinding语言提供的功能。请注意,尽管Java使用vtable调度进行方法调用,但它仍被认为是一种后期绑定语言,因此由于具有虚拟机和类加载器系统而具有上述功能,这是提供运行时检测的另一种方法。“纯”
Swift(不带Objective-C互操作)类似于C
++,因为它是具有静态分派的直接可执行的编译语言,因此在运行时这些动态功能是不可能的。按照ARC的传统,我们可能会看到更多此类功能正在编译时移动,这在“每瓦性能”方面具有优势-
这是移动计算中的重要考虑因素。



