Где в памяти размещаются глобальные и статические переменные в iOS?

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

Ответ

Глобальные и статические переменные размещаются в сегменте данных (data segment) исполняемого файла, который загружается в память при запуске приложения. Их время жизни равно времени жизни всей программы.

Детали размещения:

Тип переменной Сегмент Инициализация
Инициализированные глобальные/статические (var x = 5) .data (data section) При загрузке программы
Неинициализированные или равные нулю (var y: Int?) .bss (Block Started by Symbol) Заполняются нулями при загрузке

Примеры в коде:

// Инициализированная глобальная переменная -> .data segment
let appVersion: String = "1.0"

// Неинициализированная глобальная переменная -> .bss segment
var userSessionCount: Int // Или `var userSessionCount: Int? = nil`

// Статическая переменная внутри типа/функции -> также .data/.bss
class NetworkManager {
    static let shared = NetworkManager() // Объект в куче, ссылка в .data
    static var requestTimeout: TimeInterval = 30.0 // Значение в .data
}

Ключевые моменты:

  • Для ссылочных типов (экземпляров классов): Сам объект создается в куче (heap), а сама ссылка (указатель) хранится в data segment.
  • Потокобезопасность: Доступ к глобальным переменным из нескольких потоков требует синхронизации (например, с помощью DispatchQueue, actors или замков).
  • Архитектурные соображения: Чрезмерное использование глобального состояния усложняет тестирование, понимание потока данных и может привести к скрытым зависимостям. Предпочтительны инъекция зависимостей и четко ограниченные контейнеры состояния.