Ответ
Это два механизма динамического вызова методов (dynamic dispatch).
Table Dispatch (VTable Dispatch) — используется по умолчанию для классов в Swift.
- Каждый класс содержит таблицу виртуальных методов (vtable) — массив указателей на функции.
- Вызов метода:
object.vtable[index](). - Быстро (O(1) доступ по индексу).
- Статично: Нельзя изменить поведение метода во время выполнения.
Message Dispatch — используется в Objective-C и для @objc методов в Swift.
- Вызов метода:
objc_msgSend(object, selector). - Динамический поиск по цепочке классов во время выполнения.
- Медленнее, но позволяет method swizzling, динамическое добавление методов, KVO.
Пример в Swift:
// По умолчанию — Table Dispatch
class Animal {
func speak() { print("...") } // Table dispatch
}
// Message Dispatch (требует наследования от NSObject и @objc)
class Dog: NSObject {
@objc dynamic func bark() { print("Woof!") } // Message dispatch
// @objc dynamic позволяет method swizzling и KVO
}
// Method Swizzling (только с Message Dispatch)
let originalMethod = class_getInstanceMethod(Dog.self, #selector(Dog.bark))
let swizzledMethod = class_getInstanceMethod(Dog.self, #selector(Dog.silentBark))
method_exchangeImplementations(originalMethod!, swizzledMethod!)
Когда что используется:
- Swift классы, не наследующие от NSObject: Table Dispatch.
- Swift классы с
@objcили наследующие от NSObject: Message Dispatch для@objcметодов. - Swift value types (struct, enum): Static dispatch (компилятор подставляет прямой вызов).