Где в памяти хранятся reference types в Swift?

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

Ответ

Reference types (классы, замыкания) хранятся в куче (heap), а переменные, содержащие ссылки на них, — в стеке (stack).

Почему так?

  • Куча позволяет выделять память динамически и хранить объекты с неопределенным временем жизни.
  • Стек хранит локальные переменные и указатели (адреса памяти), что обеспечивает быстрый доступ и автоматическое управление.

Пример:

class Person {
    var name: String
    init(name: String) { self.name = name }
}

// person1 в стеке хранит указатель на объект Person в куче
let person1 = Person(name: "Alice")

// person2 копирует ссылку, а не объект
var person2 = person1
person2.name = "Bob"

print(person1.name) // "Bob" — оба указателя ссылаются на один объект

Управление памятью: Swift использует ARC (Automatic Reference Counting) для автоматического освобождения памяти в куче, когда счетчик ссылок на объект становится нулевым.