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

Ответ

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

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

Ответ 18+ 🔞

А, слушай, вот это тема — про то, где у нас память-то живёт! Ну, короче, смотри.

Вот объявляешь ты свой класс, там class Person, и думаешь: "О, я сейчас умный объект создам!" А система на тебя смотрит и думает: "Ну вот, опять этот кретин будет плодить свои сущности в куче, блядь".

Как это, сука, происходит:

  1. Ты вызываешь Person(name: "Alice"). Система, такая: "Опа, новый чувак на районе!". Лезит в кучу, ищет свободный кусок места, где этот твой объект поместится. Находит, блядь, какой-нибудь дырявый блок.
  2. Выделяет его, типа "Вот твоя хата, живи". Память уже готова, но пустая, как твоя голова после пятницы.
  3. Дёргает твой инициализатор init, который уже внутри этой выделенной хаты начинает мебель расставлять: self.name = name.
  4. И тебе в руки суёт не сам этот объект, охуеть, а всего лишь бумажку с адресом — ссылку. Вот эта переменная person — она просто бумажка, а не дом. Сам дом — в куче, блядь.
class Person { // Reference type — значит, жить будет в куче, ёпта
    let name: String
    init(name: String) {
        self.name = name // Память для экземпляра Person уже выделена в куче, мы тут просто вешаем табличку
    }
}
// Вот в этой строчке вся магия и пиздец:
let person = Person(name: "Alice") // 'person' — это НЕ объект. Это ссылка, записка "где искать объект". А сам объект — в куче.

А теперь, сука, контрастный душ! Со структурами (struct) всё иначе. Они, в идеале, живут на стеке. Быстро создались, быстро умерли, не мусорят. Как одноразовые стаканчики, блядь.

НО! Не всё так просто, ёпта! Эта хитрая жопа-структура может неожиданно оказаться в куче, если:

  • Её захватило @escaping замыкание. Оно, сука, как чемодан, может утащить её с собой куда угодно и надолго.
  • Она свойство класса. Раз класс живёт в куче, то и все его вещи — там же.
  • Ты запихнул её в Any. Это как сказать: "Храни это где хочешь, мне похуй". Система, такая: "Окей, поехала в кучу, на всякий случай".

Кто за этим всем следит? За кучей следит ARC (Automatic Reference Counting) — такой бухгалтер с калькулятором. Он считает, сколько бумажек-ссылок на объект ты раздал. Как только бумажки кончились (счётчик стал ноль), он такой: "Объект-бомж, можно выселять!". Память помечается как свободная. Может, не сразу её выкинут, но суть ты понял.

И почему это, блядь, важно? Да потому что куча — это не стек! На стеке всё быстро и чётко. А в куче — поиск места, выделение, потом ещё уборка... Это как сравнивать быстрый перекус в забегаловке и поход в ресторан с официантами. Если ты будешь в цикле создавать кучу мелких объектов-однодневок в куче — производительность просядет, как твои шансы на пятерку по матану. ARC будет охуевать от работы, система будет копошиться. Пиздец, а не оптимизация.

Вот так-то, дружок. Выбирай, где жить твоим данным: в быстром, но тесном общежитии (стек) или в просторной, но медленной коммуналке (куча).