В каких областях памяти хранятся переменные в Swift?

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

Ответ

Место хранения переменной определяется её типом (value type / reference type) и способом объявления.

Тип / Объявление Область памяти Управление памятью Особенности
Локальные переменные (value types)
let x = 5, var arr = [1,2]
Стек (Stack) Автоматическое (при выходе из scope) Быстрый доступ, размер известен на этапе компиляции.
Экземпляры классов (reference types)
let object = MyClass()
Куча (Heap) Автоматически (ARC) Сам объект в куче. Переменная object — это ссылка, хранящаяся в стеке.
Глобальные и статические переменные
let appName = "MyApp"
static let id = 123
Data Segment Время жизни программы Выделяется при запуске приложения.

Почему это важно?

  • Стек: Очень быстрый, но ограниченный по размеру. Идеален для временных данных.
  • Куча: Гибкий (динамическое выделение), но медленнее и требует управления через ARC (Automatic Reference Counting).
  • Data Segment: Для данных, которые должны существовать всё время работы приложения.

Пример, иллюстрирующий разницу:

struct Point { var x, y: Int } // Value type
class Label { var text: String } // Reference type

func test() {
    let point = Point(x: 0, y: 0) // `point` и его данные (0,0) — в стеке.
    let label = Label(text: "Hi") // Ссылка `label` — в стеке. Сам объект Label — в куче.
} // Здесь `point` уничтожается. Для `label` ARC уменьшает счетчик ссылок на объект в куче.