在swift中方法调度分为两种,直接调用
和查找调用
struct
结构体的方法调用方式为直接调用
,直接调用函数地址
class
类的方法调用方式为查找调用
,函数都按照顺序存储在vtable
中,需要偏移
效率上来讲应该是直接调用
更快吧
举例说明,打开汇编调式面板
struct YMStruct {
func struct_test() {
print("struct_test")
}
}
class YMClass {
func class_test() {
print("class_test")
}
}
let str = YMStruct()
str.struct_test()
let cla = YMClass()
cla.class_test()
extension
中的方法
在swift中,写在extension
中的方法是不能被继承的,因为也是直接调用,并不在vtable
中,不可以被重写
final
关键字
在swift中,使用final
修饰的方法和属性,也不会写入vtable
中,子类不可重写,只可以调用
@objc
关键字
在button添加方法时#selector
,编译器会提示我们使用@objc
关键字
如果需要oc与swift混编,调用swift的类时,不仅是添加@objc
关键字,还需要继承于NSObjc
dynamic
关键字
标记为dynamic
的变量/函数会隐式的加上@objc
关键字,它会使用OC的runtime机制,Swift 为了追求性能,Swift 类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找,想要实现OC的方法交换或者kvo都需要要添加dynamic
关键字