Swift 方法调度

在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关键字

你可能感兴趣的:(Swift 方法调度)