Почему экземпляры классов хранятся в куче (heap)?

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

Ответ

Экземпляры классов (ссылочные типы) хранятся в куче по нескольким ключевым причинам:

1. Динамическое время жизни: Объект должен существовать дольше, чем область видимости функции, в которой он создан. Куча управляет памятью динамически. 2. Передача по ссылке: При присваивании или передаче в функцию копируется только ссылка (указатель), а не все данные объекта. Это эффективно и позволяет разделять состояние. 3. Управление через ARC: Счетчик ссылок (Automatic Reference Counting) для освобождения памяти может корректно работать только с четко идентифицируемыми объектами в куче.

Пример (Swift):

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

// Объект создается в куче
let person1 = Person(name: "Alice")
// Копируется только ссылка, оба указателя ссылаются на один объект в куче
let person2 = person1
person2.name = "Bob"
print(person1.name) // "Bob"

Контраст со стеком: Value-типы (структуры, перечисления) хранятся в стеке, так как они имеют предсказуемый размер и время жизни, ограниченное областью видимости, и безопасно копируются.