У всех объектов в Swift есть свой собственный жизненный цикл (Object lifecycle). Он хорошо задокументирован в исходном коде. Жизненный цикл состоит из пяти состояний: Live, Deiniting, Deinited, Freed и Dead.
Состояние Live
При создании объекта он переходит в состояние Live. В этом состоянии счетчик ссылок выставлен минимум в 1. Например, у нашего объекта есть сильная ссылка (strong), бесхозная (unowned) и слабая (weak). Помним: если есть указатель на слабую ссылку, то создается side table.
Состояние Deiniting
Когда счетчик сильных ссылок достигает нуля, то вызывается deinit() и объект переходит в следующее состояние — Deiniting. В этом состоянии операции со strong ссылкам не работают. При чтении слабой ссылки возвращается nil. Обращение к unowned ссылкам вызывает assertion failure. Но новые unowned ссылки на данном этапе еще могут добавляться к объекту.
Из состояния Deinitin можно перейти в два других:
- Если нет weak ссылок (другими словами нет side table) и нет unowned ссылок, то объект переходит в состояние Dead и сразу удаляется из памяти.
- Если есть weak или unowned ссылка, то переходим в состояние Deinited.
Состояние Deinited
В этом состоянии deinit() уже завершена. Сохранение strong, weak или unowned ссылок невозможно. Чтение strong и weak тоже невозможно. Чтение unowned ссылки вызывает assertion failure.
Из этого состояния можно перейти в два других:
- Если нет weak ссылок, то переходим в состояние Dead и объект сразу удаляется из памяти.
- Если существует слабая ссылка, то переходим в состояние Freed.
Состояние Freed
В этом состоянии объект уже не занимает место в памяти, но его боковая таблица (side table) остается жива. После того как счетчик слабых ссылок достигает нуля, боковая таблица тоже удаляется и освобождает память. Далее осуществляется переход в конечное состояние — Dead.
Состояние Dead
В этом состоянии от объекта уже ничего не остается кроме указателя на него в памяти. Указатель уже удаляется в куче.
Дополнительная литература:
- Управление памятью в Swift
- deinit: как и где вызывается?
- Расширенное управление памятью iOS с помощью Swift
Выразить благодарность или найти уникальный материал вы можете в boosty.
Подписывайтесь на мой Telegram-канал iOS Interview Channel, чтобы не пропустить новый материал.