Где в памяти размещается массив в Swift?

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

Ответ

Место хранения массива в Swift зависит от контекста его объявления и семантики типов.

Основные случаи:

  1. Стек (Stack): Локальные переменные типа Array, объявленные внутри функции или метода, обычно размещаются в стеке.
    func calculate() {
        var localArray = [1, 2, 3] // Буфер элементов управляется из стека (с оптимизациями).
    }
  2. Куча (Heap): Если массив является свойством класса (reference type) или должен пережить область видимости функции (например, возвращается из функции), его буфер размещается в куче.
    class DataContainer {
        var storedArray = [4, 5, 6] // Буфер массива находится в куче.
    }
  3. Глобальная/Статическая область: Глобальные или статические массивы инициализируются один раз и имеют особую область хранения.
    let globalConstants = [7, 8, 9]

Важный нюанс — Copy-on-Write (CoW): Массив в Swift — это структура (value type), но его элементы хранятся в буфере, который является reference type. При копировании массива (например, при присваивании или передаче в функцию) реальное копирование буфера происходит только при его изменении (Copy-on-Write). Это оптимизирует использование памяти и производительность.

var arrayA = [1, 2, 3]
var arrayB = arrayA          // Оба массива ссылаются на один буфер (копирования нет).
arrayB.append(4)             // Теперь происходит копирование буфера для arrayB.