В чем разница между Table Dispatch и Message Dispatch в Swift/Objective-C?

«В чем разница между Table Dispatch и Message Dispatch в Swift/Objective-C?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это два механизма динамического вызова методов (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 (компилятор подставляет прямой вызов).