Когда инициализируются статические (static) переменные в Swift/Objective-C?

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

Ответ

Момент инициализации зависит от языка и контекста:

В Swift (глобальные и статические свойства)

  • По умолчанию (ленивая инициализация): При первом обращении. Это потокобезопасно.
  • Использование @objc или dynamic: Может инициализироваться при загрузке класса, аналогично Objective-C.
class MyClass {
    static let shared = MyClass() // Инициализируется при первом вызове MyClass.shared
    static var count: Int = 0     // Инициализируется при первом обращении к MyClass.count
    @objc static let constant = "Value" // Может быть инициализирована на этапе загрузки
}

В Objective-C

  • Статические переменные внутри функций (static): Инициализируются при первом вызове функции.
  • Глобальные статические переменные (вне функций): Инициализируются до вызова main() или в момент загрузки модуля (фаза +load или +initialize).

Важно: Порядок инициализации статических объектов между модулями не гарантирован. Циклические зависимости могут привести к неопределенному поведению.