Хранятся ли reference-типы (экземпляры классов) в стеке в Swift?

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

Ответ

Нет. Экземпляры классов (reference types) всегда хранятся в куче (heap). В стеке хранятся лишь указатели (references) на эти объекты, а также value-типы (структуры, перечисления, примитивы).

Пример:

class MyClass { } // Reference type -> хранится в куче
struct MyStruct { } // Value type -> хранится в стеке (если не захвачен замыканием)

let object = MyClass() // Указатель `object` хранится в стеке, сам объект — в куче
let value = MyStruct() // Вся структура `value` хранится в стеке

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

  • Куча позволяет объектам существовать за пределами scope функции и разделяться между ссылками.
  • Стек работает по принципу LIFO и используется для локальных переменных и вызовов функций.
  • Компилятор Swift может применять оптимизации (например, escape-анализ), чтобы временно разместить объект на стеке, если его lifetime ограничен текущей функцией. Это деталь реализации, не меняющая семантику языка.