Где в памяти хранится класс, который является свойством структуры в Swift?

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

Ответ

Ответ зависит от типа памяти самой структуры, но экземпляр класса всегда хранится в куче (heap).

Механика:

  • Структура (struct) — тип-значение. Если она локальная переменная, то хранится в стеке. Если свойство класса — в куче.
  • Класс (class) — ссылочный тип. Его экземпляр всегда создается в куче.
  • Свойство структуры, имеющее тип класса, содержит не сам объект, а ссылку на него. Эта ссылка хранится вместе со структурой, а объект — отдельно в куче.

Наглядный пример:

class MyClass { var value = 42 }
struct MyStruct { let object = MyClass() } // свойство - ссылка на класс

var structA = MyStruct() // Структура в стеке, MyClass в куче
var structB = structA    // Копируется ВСЯ структура (значение), но ссылка `object` в копии указывает на ТОТ ЖЕ объект в куче.

structB.object.value = 10
print(structA.object.value) // 10! Обе структуры разделяют один экземпляр класса.

Вывод: Объект класса живет в куче независимо от контекста. Структура хранит лишь ссылку на него.