Ответ
Память в куче выделяется в момент создания экземпляра класса (reference type) с помощью вызова инициализатора (init).
Процесс выделения:
- Система находит свободный блок памяти достаточного размера в куче.
- Выделяет этот блок для нового объекта.
- Вызывает инициализатор, который настраивает выделенную память.
- Возвращает ссылку на этот участок памяти.
class Person { // Reference type
let name: String
init(name: String) {
self.name = name // Память для экземпляра Person уже выделена в куче
}
}
// Выделение памяти происходит здесь, при вызове Person.init:
let person = Person(name: "Alice") // 'person' содержит ссылку на объект в куче
Контраст со структурами: Для структур (value types) память обычно выделяется на стеке текущего вызова функции. Однако структура может оказаться в куче, если:
- Она захвачена
@escapingзамыканием. - Является свойством класса.
- Присваивается переменной типа
Any.
Управление памятью: За памятью в куче автоматически следит ARC (Automatic Reference Counting). Когда счетчик сильных ссылок на объект достигает нуля, система помечает эту память как свободную (освобождение может быть отложенным).
Почему это важно? Операции с кучей (аллокация, деаллокация) медленнее, чем работа со стеком. Чрезмерное создание кратковременных объектов в куче может негативно сказаться на производительности.