Ответ
Размер Swift-приложения может быть больше аналогичного на Objective-C из-за особенностей компиляции и безопасности языка.
Основные причины:
-
Библиотека времени выполнения (Swift Runtime):
- Не является частью ОС (в отличие от Objective-C runtime).
- Включается в бинарник приложения, добавляя ~2-5 МБ.
-
Генерики (Generics) и специализация:
- Компилятор создает отдельную реализацию для каждой комбинации типов, используемых с дженериком.
// Для Int и String будут сгенерированы две разные функции func process<T>(_ value: T) { ... } process(10) // Специализация для Int process("text") // Специализация для String
- Компилятор создает отдельную реализацию для каждой комбинации типов, используемых с дженериком.
-
Код для гарантий безопасности:
- Проверки границ массивов, переполнения целых чисел, обработка опционалов — весь этот код добавляется в бинарник.
-
Отладочные сборки (
-Onone):- Содержат символы для отладки и минимальную оптимизацию, что сильно увеличивает размер.
Способы оптимизации размера:
- Release-оптимизация: Используйте
-Osize(оптимизация по размеру) вместо-O(по скорости). - Удаление неиспользуемого кода: Включите
DEAD_CODE_STRIPPING = YESиSTRIP_STYLE = ALL. - Использование App Thinning: (Bitcode, Slicing) для доставки оптимизированного бинарника под каждое устройство.
- Минимизация динамических фреймворков: Статическая линковка может уменьшить итоговый размер.