Выбор ответа Senior Модульность обновлено

Статические и динамические модули на iOS

Вопрос

Приложение разбито на 80 динамических фреймворков, и холодный старт стал медленнее. Почему и что делать?

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

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

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

Коротко

Правильный ответ: Загрузчик тратит время на каждую динамическую библиотеку при запуске; модули линкуют статически. Каждая динамическая библиотека это работа dyld до main: загрузка, связывание символов, применение фиксапов.

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

  1. Загрузчик тратит время на каждую динамическую библиотеку при запуске; модули линкуют статическиправильный ответ
  2. Динамические фреймворки загружаются лениво и не влияют на старт, причина в инициализаторах +load
  3. Нужно перевести модули на Objective-C: Swift-фреймворки линкуются медленнее из-за метаданных
  4. Apple ограничивает приложение 50 динамическими модулями, остальные загружаются в режиме эмуляции

Разбор

Каждая динамическая библиотека это работа dyld до main: загрузка, связывание символов, применение фиксапов. Десятки фреймворков дают заметную задержку. Статическая линковка сливает код в бинарник приложения, а модульность в исходниках сохраняется. Динамической делают библиотеку, которую разделяют приложение и его расширения (виджеты, share extension), чтобы не дублировать код. Лимита Apple на число модулей нет.

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

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