В чем разница между статической и динамической библиотекой в iOS?

«В чем разница между статической и динамической библиотекой в iOS?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Статическая библиотека (.a или статический .framework) линкуется с кодом приложения на этапе компиляции. Ее код становится неотъемлемой частью исполняемого файла (бинарника).

Динамическая библиотека (.dylib или динамический .framework) линкуется на этапе запуска приложения (runtime). Код библиотеки находится в отдельном файле, который загружается в память и может использоваться несколькими процессами.

Сравнение: Критерий Статическая библиотека Динамическая библиотека
Время линковки Компиляция (compile-time) Загрузка (runtime)
Размер приложения Увеличивает, так как код копируется в бинарник Не увеличивает (кроме заголовков), но библиотека должна быть доставлена с приложением
Обновление Требует пересборки приложения Можно заменить (с ограничениями в iOS)
Разделение кода Нет, код вшит в приложение Да, одна копия в памяти для нескольких процессов (системные библиотеки)
Загрузка Мгновенная, код уже в бинарнике Небольшая задержка при запуске

iOS-специфика:

  1. Embedding: Сторонние динамические фреймворки (.framework) должны быть внедрены (Embedded Binaries) в бандл приложения для iOS, иначе оно не запустится. Системные фреймворки (например, Foundation.framework) уже присутствуют в iOS.
  2. App Store & Swift: Swift-библиотеки не могут быть статически линкованы в системную кэш-память, поэтому Swift-зависимости часто доставляются как динамические фреймворки или через Swift Package Manager, который управляет линковкой.

Как добавить в Xcode:

  • Статическая: Добавить в "Link Binary With Libraries" (обычно .a или .framework).
  • Динамическая: Добавить в "Link Binary With Libraries" и в "Embed Frameworks" (для .framework).