Какие факторы влияют на размер бинарного файла приложения на Swift?

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

Ответ

Размер Swift-приложения может быть больше аналогичного на Objective-C из-за особенностей компиляции и безопасности языка.

Основные причины:

  1. Библиотека времени выполнения (Swift Runtime):

    • Не является частью ОС (в отличие от Objective-C runtime).
    • Включается в бинарник приложения, добавляя ~2-5 МБ.
  2. Генерики (Generics) и специализация:

    • Компилятор создает отдельную реализацию для каждой комбинации типов, используемых с дженериком.
      // Для Int и String будут сгенерированы две разные функции
      func process<T>(_ value: T) { ... }
      process(10)      // Специализация для Int
      process("text") // Специализация для String
  3. Код для гарантий безопасности:

    • Проверки границ массивов, переполнения целых чисел, обработка опционалов — весь этот код добавляется в бинарник.
  4. Отладочные сборки (-Onone):

    • Содержат символы для отладки и минимальную оптимизацию, что сильно увеличивает размер.

Способы оптимизации размера:

  • Release-оптимизация: Используйте -Osize (оптимизация по размеру) вместо -O (по скорости).
  • Удаление неиспользуемого кода: Включите DEAD_CODE_STRIPPING = YES и STRIP_STYLE = ALL.
  • Использование App Thinning: (Bitcode, Slicing) для доставки оптимизированного бинарника под каждое устройство.
  • Минимизация динамических фреймворков: Статическая линковка может уменьшить итоговый размер.