Что выполняется в iOS-приложении до запуска функции main()?

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

Ответ

До входа в точку входа main() система выполняет ряд критических шагов по загрузке и инициализации приложения:

  1. Загрузка динамических библиотек (dyld): Динамический линкер загружает исполняемый файл приложения и все связанные фреймворки.
  2. Инициализация Objective-C runtime: Если в проекте используется Objective-C или Swift с наследованием от NSObject, инициализируется рантайм (регистрация классов, категорий, протоколов).
  3. Вызов конструкторов глобальных и статических объектов C++: Для объектов с глобальной или статической продолжительностью хранения.
  4. Вызов методов +load (устарел): Классы и категории, реализующие этот метод, получают вызов. Важно: Порядок вызова между разными модулями не гарантирован. Apple не рекомендует использовать +load начиная с iOS 7.

    @implementation MyClass
    + (void)load {
        NSLog(@"Метод +load выполняется до main()");
    }
    @end
  5. Вызов методов +initialize (при первом обращении): Этот метод вызывается лениво, перед первым использованием класса. Это предпочтительная альтернатива +load для отложенной инициализации.

Практический совет: Для современной разработки полагайтесь на ленивую инициализацию в +initialize или, что чаще, в инициализаторах Swift, и избегайте +load из-за его влияния на время запуска.