Как уменьшить время запуска (launch time)? Что такое pre-main?
Суть
Запуск делится на две фазы:
- Pre-main — всё до вызова
main(): ядро создаёт процесс, dyld загружает исполняемый файл и динамические библиотеки, применяет fixups (с iOS 15 — chained fixups вместо отдельных rebase/bind, они быстрее и ленивее), регистрирует Obj-C-классы и категории, выполняет+loadи C++ static initializers. Ваш код здесь почти не участвует — только+loadи глобальные инициализаторы. - Post-main —
UIApplicationMain,didFinishLaunching, создание сцены, первыйlayoutSubviews/bodyи первый кадр. Apple ориентирует на первый кадр ≤ 400 мс (холодный старт).
Отдельно: prewarming (iOS 15+) — система может запустить процесс заранее и остановить его после pre-main, поэтому pre-main при «реальном» запуске уже оплачен. Это важно для измерений: ProcessInfo аптайм процесса не равен времени, которое видел пользователь.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep