Жизненный цикл объекта в Swift

У всех объектов в Swift есть свой собственный жизненный цикл (Object lifecycle). Он хорошо задокументирован в исходном коде. Жизненный цикл состоит из пяти состояний: Live, Deiniting, Deinited, Freed и Dead.

Жизненный цикл объекта в Swift

Состояние Live

При создании объекта он переходит в состояние Live. В этом состоянии счетчик ссылок выставлен минимум в 1. Например, у нашего объекта есть сильная ссылка (strong), бесхозная (unowned) и слабая (weak). Помним: если есть указатель на слабую ссылку, то создается side table.

Состояние Live

Состояние Deiniting

Когда счетчик сильных ссылок достигает нуля, то вызывается deinit() и объект переходит в следующее состояние — Deiniting. В этом состоянии операции со strong ссылкам не работают. При чтении слабой ссылки возвращается nil. Обращение к unowned ссылкам вызывает assertion failure. Но новые unowned ссылки на данном этапе еще могут добавляться к объекту.

Состояние Deiniting

Из состояния Deinitin можно перейти в два других:

  • Если нет weak ссылок (другими словами нет side table) и нет unowned ссылок, то объект переходит в состояние Dead и сразу удаляется из памяти.
  • Если есть weak или unowned ссылка, то переходим в состояние Deinited.

Состояние Deinited

В этом состоянии deinit() уже завершена. Сохранение strong, weak или unowned ссылок невозможно. Чтение strong и weak тоже невозможно. Чтение unowned ссылки вызывает assertion failure.

Из этого состояния можно перейти в два других:

  • Если нет weak ссылок, то переходим в состояние Dead и объект сразу удаляется из памяти.
  • Если существует слабая ссылка, то переходим в состояние Freed.
Deinited

Состояние Freed

В этом состоянии объект уже не занимает место в памяти, но его боковая таблица (side table) остается жива. После того как счетчик слабых ссылок достигает нуля, боковая таблица тоже удаляется и освобождает память. Далее осуществляется переход в конечное состояние — Dead.

Freed

Состояние Dead

В этом состоянии от объекта уже ничего не остается кроме указателя на него в памяти. Указатель уже удаляется в куче.

Дополнительная литература:

Выразить благодарность или найти уникальный материал вы можете в boosty.

Подписывайтесь на мой Telegram-канал iOS Interview Channel, чтобы не пропустить новый материал.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *