在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
關鍵字