Ответ
Глобальные и статические переменные размещаются в сегменте данных (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или замков). - Архитектурные соображения: Чрезмерное использование глобального состояния усложняет тестирование, понимание потока данных и может привести к скрытым зависимостям. Предпочтительны инъекция зависимостей и четко ограниченные контейнеры состояния.