Как работает управление памятью в Swift
Что проверяют
Знаете ли вы, что это подсчёт ссылок на этапе компиляции, и понимаете ли, где он ломается и как устроены разные области памяти.
Как отвечать
Основа это ARC, автоматический подсчёт ссылок. Компилятор сам расставляет retain и release, во время работы память никто не сканирует. Счётчик сильных ссылок дошёл до нуля, вызвался deinit, память освободилась немедленно и предсказуемо.
Работает это только для ссылочных типов. Структуры, перечисления и кортежи это значимые типы: они копируются, а не считаются. Коллекции при этом используют копирование при записи, поэтому копия дешёвая, пока её не меняют.
Где память размещается: значимые типы обычно на стеке, экземпляры классов в куче, замыкания захватывают окружение тоже в кучу.
Слабое место ARC это циклы. Два объекта держат друг друга сильными ссылками, счётчик ни у одного не обнуляется. Разрывают их weak (не держит, обнуляется, всегда опционально) и unowned (не держит, не обнуляется, обращение к мёртвому объекту это падение). Классический случай в замыканиях, где решение это список захвата [weak self].
Стоит добавить сравнение: у сборщика мусора есть пауза и фоновый поток, зато он умеет собирать циклы. У ARC пауз нет и накладные расходы предсказуемы, но циклы он не разрывает, это работа программиста.
Где спотыкаются
Называют ARC сборщиком мусора.
Считают, что структуры тоже подсчитываются.
Ставят unowned там, где объект может умереть раньше, и получают падение вместо nil.
Забывают, что замыкание, сохранённое в свойстве, захватывает self сильно.