DevPrep

Все темы › Язык Swift

final, private, @objc, dynamic — как влияют на диспетчеризацию?

Senior PRO

Суть

Модификаторы сдвигают метод по шкале «статический → 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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store