Что такое vtable (виртуальная таблица) в контексте памяти
Что проверяют
Понимаете ли вы, как вызов метода превращается в переход по адресу и чем за это платит память. На iOS вопрос ведёт к диспетчеризации в Swift: что попадает в таблицу, что решается на компиляции и почему final и модификаторы доступа влияют на скорость.
Как отвечать
vtable это таблица указателей на функции. Для класса с наследуемыми методами компилятор строит её один раз и кладёт в метаданные класса, а экземпляр хранит только указатель на эти метаданные рядом со счётчиком ссылок. То есть накладной расход на объект это одно машинное слово, а не копия таблицы: сама таблица общая для всех экземпляров класса.
Вызов через таблицу это две косвенности: взять метаданные из объекта, взять адрес из нужной ячейки, прыгнуть. Встроить такой вызов компилятор не может, пока не доказал конкретный тип.
В Swift стоит перечислить все виды диспетчеризации: структуры и перечисления, final, private и оптимизация в пределах модуля дают прямой вызов; обычные методы класса идут через vtable; требования протокола через таблицу свидетельств; @objc dynamic уходит в objc_msgSend с кешем селекторов.
Где спотыкаются
Переносят картину из C++ на Objective-C и говорят, что там тоже vtable. Там динамическая рассылка сообщений по селектору с кешем, и именно поэтому работают категории и подмена реализации в рантайме.
Думают, что таблица лежит в каждом объекте. В объекте только указатель на метаданные, и расход памяти растёт не от числа методов в классе, а от числа живых экземпляров.
Забывают про методы, объявленные только в расширении протокола. Они не входят в набор требований, вызываются статически по типу переменной, и реализация в конкретном типе не подхватится. Это классический источник поведения, которое на собеседовании выглядит мистикой.