> Примеры случаев хранения значений на куче и как устроено выделение памяти для массивов (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Bip.ru

Стек: iOS, Swift

> Пример ответа

В Swift значения на куче (heap) хранятся в следующих случаях:

  1. Экземпляры классов - классы являются ссылочными типами, их объекты всегда размещаются в куче. Например: class Person { var name: String }.

  2. Замыкания - если замыкание захватывает значения, оно выделяется в куче для хранения захваченного контекста.

  3. Некоторые коллекции - Array, String, Dictionary, Set используют кучевое хранение для своих элементов, когда размер превышает определённый порог (обычно 3-4 слова). Сама структура коллекции находится в стеке, но её буфер данных - в куче.

Выделение памяти для массивов в Swift устроено следующим образом:

  • Массив - это структура (struct Array<Element>), которая хранит в стеке указатель на буфер в куче, а также счётчик элементов и ёмкость.
  • При создании массива выделяется непрерывный блок памяти в куче под элементы. Если массив пуст, буфер может не выделяться (оптимизация).
  • При добавлении элементов, если ёмкость превышена, происходит перераспределение: выделяется новый буфер большего размера (обычно в 2 раза), старые элементы копируются, старый буфер освобождается.
  • Swift использует механизм Copy-on-Write (COW): при копировании массива (например, let b = a) оба массива указывают на один буфер, пока один из них не будет изменён. При изменении создаётся уникальная копия буфера в куче.
  • Для оптимизации маленькие массивы (до 3 элементов) могут храниться в стеке без кучи (встроенное хранилище), но это деталь реализации.

Пример:

SWIFT
var numbers = [1, 2, 3] // буфер в куче, 3 элемента
var copy = numbers // COW: общий буфер
copy.append(4) // создаётся новый буфер в куче, копируются старые элементы

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью