Какие области памяти, помимо стека и кучи, существуют в iOS/macOS?

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

Ответ

Помимо стека (для локальных переменных и вызовов функций) и кучи (для динамически выделяемых объектов), в процессах существуют и другие сегменты памяти:

  1. Сегмент кода (Text/Code Segment):

    • Содержит: Исполняемый машинный код программы (инструкции).
    • Особенности: Только для чтения (read-only), защищен от модификации.
  2. Сегмент данных (Data Segment):

    • Глобальные и статические данные (Global/Static): Хранит статические переменные (static), глобальные переменные и константы, инициализированные при запуске. Существует всю жизнь процесса.
      static let appVersion = "1.0.0" // Хранится здесь
    • BSS (Block Started by Symbol): Подсекция для неинициализированных глобальных и статических переменных (заполняется нулями).
  3. Регистры процессора (Registers):

    • Сверхбыстрая память внутри CPU для временных данных и адресов во время исполнения инструкций. Не адресуется напрямую в коде.
  4. Memory-mapped I/O:

    • Специальная область, где адреса памяти соответствуют не ОЗУ, а регистрам аппаратных устройств. Чтение/запись по этим адресам управляет железом.
  5. Thread-local Storage (TLS):

    • Память, уникальная для каждого потока. В Swift доступ через Thread.current.threadDictionary.
      Thread.current.threadDictionary["requestId"] = "123"
  6. Autorelease Pool:

    • Не является отдельной физической областью, но это важный механизм управления временем жизни объектов. В него попадают объекты, от которых отказались с помощью autorelease (в Objective-C/Swift с @autoreleasepool). Пул периодически дренируется, освобождая объекты.

Важно: ARC в Swift управляет памятью объектов в куче. Стек используется для примитивов, структур и ссылок на объекты. Глобальные константы (let) могут размещаться в сегменте данных или (для оптимизации) непосредственно в коде.