Могут ли экземпляры классов в Swift храниться в стеке?

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

Ответ

Нет, экземпляры классов в Swift всегда хранятся в куче (heap). Это обусловлено их ссылочной семантикой и необходимостью динамического управления временем жизни.

Почему? Классы имеют ссылочную семантику. Несколько переменных могут ссылаться на один и тот же экземпляр в памяти. Стек работает по принципу LIFO (последним пришел — первым ушел) и управляется автоматически при входе/выходе из функций, что не подходит для сложного жизненного цикла общих объектов.

Что может храниться в стеке?

  • Экземпляры структур (struct) и перечислений (enum) с семантикой копирования (value types), если они:
    • Не привязаны к классу (например, не являются его свойством).
    • Не захвачены замыканием, которое может пережить текущую область видимости.

Пример:

class MyClass { } // Экземпляр будет в куче
struct MyStruct { } // Экземпляр может быть в стеке

let object = MyClass() // Выделение памяти в куче
let value = MyStruct() // Скорее всего, размещение в стеке (если локальная переменная)

Исключение: Структура, содержащая свойство-класс, сама может быть размещена в стеке, но данные этого свойства (объект класса) всё равно будут находиться в куче.