Какие данные хранятся в стеке (stack) в iOS/macOS?

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

Ответ

Стек (stack) — это область памяти для хранения локальных и временных данных с чётким LIFO (Last-In, First-Out) порядком жизни, привязанных к текущему контексту выполнения (функции, методу).

Что хранится в стеке:

  • Локальные переменные типов-значений (Value Types): Int, Double, Bool, struct, enum и т.д.
  • Ссылки (указатели) на объекты в куче. Сами объекты — в куче, но переменные, которые на них ссылаются, — в стеке.
  • Аргументы, передаваемые в функции.
  • Адреса возврата из функций (куда передать управление после завершения).
  • Служебная информация о вызове функций (фреймы стека).

Ключевые особенности стека:

  • Очень быстрый: Выделение и освобождение памяти — это просто движение указателя стека.
  • Автоматическое управление: Память освобождается сразу при выходе из области видимости (scope).
  • Ограниченный размер: Размер стека фиксирован и относительно мал (несколько МБ). Переполнение стека — частая причина крашей при глубокой рекурсии.
  • Потокобезопасность: У каждого потока свой собственный стек.

Пример:

func calculateSum(a: Int, b: Int) -> Int { // `a` и `b` размещаются в стеке
    let result = a + b // Локальная переменная `result` (Int) размещается в стеке
    return result
} // При выходе из функции память для `a`, `b`, `result` автоматически освобождается

let x = 5 // `x` (Int) в стеке главного потока
let y = 10 // `y` (Int) в стеке
let sum = calculateSum(a: x, b: y) // При вызове в стек помещаются копии x и y