Опишите жизненный цикл объекта в Swift.
Фазы (по RefCount.h рантайма)
- Live — strong RC > 0. Все виды ссылок работают.
- Deiniting — strong RC упал до 0, выполняется
deinit. Уже в этой фазе чтениеweakвозвращаетnil, а чтениеunownedдаёт трап. Объект «воскресить» нельзя: сохранитьselfизdeinitв сильную переменную — ошибка. - Deinited —
deinitзавершён, поля уничтожены, но память не освобождена, пока unowned RC > 0 (unowned-ссылки должны увидеть детерминированный трап, а не мусор). - Freed — unowned RC = 0, память возвращена аллокатору. Если есть side table, она ещё жива.
- Dead — weak RC = 0, side table освобождена. Объекта больше нет нигде.
Если на объект никогда не брали weak, side table нет, и фазы 4–5 схлопываются.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep