Когда происходит выделение памяти в куче (heap) для экземпляра класса в Swift?

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

Ответ

Память в куче выделяется в момент создания экземпляра класса (reference type) с помощью вызова инициализатора (init).

Процесс выделения:

  1. Система находит свободный блок памяти достаточного размера в куче.
  2. Выделяет этот блок для нового объекта.
  3. Вызывает инициализатор, который настраивает выделенную память.
  4. Возвращает ссылку на этот участок памяти.
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). Когда счетчик сильных ссылок на объект достигает нуля, система помечает эту память как свободную (освобождение может быть отложенным).

Почему это важно? Операции с кучей (аллокация, деаллокация) медленнее, чем работа со стеком. Чрезмерное создание кратковременных объектов в куче может негативно сказаться на производительности.