final, private, @objc, dynamic — как влияют на диспетчеризацию?
Суть
Модификаторы сдвигают метод по шкале «статический → vtable → objc_msgSend». Чем больше вызовов статические, тем больше инлайнинга и тем быстрее код; динамика нужна для переопределения, KVO, swizzling.
import Foundation
class Base: NSObject {
func a() {} // vtable
final func b() {} // static: переопределить нельзя
private func c() {} // static: override невозможен
@objc func d() {} // из Swift — vtable, из Obj-C — objc_msgSend
@objc dynamic func e() {} // всегда objc_msgSend (KVO, swizzling)
dynamic func f() {} // native dynamic replacement, без Obj-C
}
extension Base {
@objc func g() {} // в extension нет vtable → objc_msgSend
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep