Выбор ответа Senior Протоколы, POP и дженерики обновлено

Как ускорить вызов методов класса

Вопрос

Какой способ позволяет компилятору вызывать метод класса напрямую, без таблицы виртуальных методов?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Пометить класс или метод final. Метод класса по умолчанию вызывается через vtable, потому что его могут переопределить. final запрещает переопределение, и вызов становится статическим, а значит может инлайниться.

Варианты ответа

  1. Добавить @objc к методу, чтобы вызов шёл напрямую
  2. Пометить класс или метод finalправильный ответ
  3. Объявить метод в расширении протокола с dynamic
  4. Сделать метод open, чтобы компилятор видел все реализации

Разбор

Метод класса по умолчанию вызывается через vtable, потому что его могут переопределить. final запрещает переопределение, и вызов становится статическим, а значит может инлайниться. Для private и fileprivate компилятор сам видит всех наследников, а при Whole Module Optimization то же работает для internal. @objc dynamic переводит вызов на objc_msgSend, это ещё медленнее. open разрешает переопределение снаружи модуля.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.