В чем разница между вопросами о хранении структуры в куче и когда она туда попадает?

«В чем разница между вопросами о хранении структуры в куче и когда она туда попадает?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это два аспекта одной темы. Первый вопрос («хранится») фокусируется на конечном, стабильном месте размещения структуры как части reference-типа. Второй вопрос («попадает») акцентирует внимание на механизме и моменте, когда value-тип начинает управляться кучей.

Ключевое различие:

  • Хранится в куче: Описывает состояние, когда структура является неотъемлемой частью объекта, живущего в куче (например, свойство класса).
  • Попадает в кучу: Описывает действие или событие, такое как захват escaping-замыканием или копирование в CoW-коллекцию, после которого жизненным циклом структуры начинает управлять куча.

Пример, объединяющий оба аспекта:

struct SensorData { var value: Double }

// 1. Структура НЕ в куче (локальная переменная в стеке).
var localData = SensorData(value: 36.6)

// 2. Структура ПОПАДАЕТ в кучу при присваивании свойству класса.
class Monitor {
    var currentData: SensorData
    init(data: SensorData) { self.currentData = data }
}
let monitor = Monitor(data: localData) // Копия `localData` теперь ХРАНИТСЯ в куче.

// 3. Структура ПОПАДАЕТ в кучу при захвате escaping-замыканием.
var dataHandler: ((SensorData) -> Void)?
dataHandler = { newData in
    // `newData` — это копия, которая была захвачена и ХРАНИТСЯ в куче вместе с замыканием.
    monitor.currentData = newData
}

Таким образом, структура попадает в кучу в момент определенных операций, а затем хранится там как часть reference-типа.