Вопрос проверяет понимание жизненного цикла объектов в ARC и того, когда реально освобождается память.
Объект деинициализируется, когда количество сильных ссылок на него становится равным нулю. В этот момент вызывается deinit, и память освобождается. ARC отслеживает это автоматически во время выполнения программы. Если существует цикл сильных ссылок, деинициализация не произойдёт. Поэтому важно правильно управлять ссылками.
Деинициализация — это финальный этап жизненного цикла объекта, и он полностью контролируется ARC.
ARC работает по простому правилу:
есть хотя бы одна strong ссылка — объект жив
все strong ссылки удалены — объект уничтожается
Как только счётчик становится равен нулю:
вызывается deinit
освобождается занимаемая память
объект становится недоступен
deinitОпределение:deinit — это метод, который вызывается автоматически перед уничтожением экземпляра класса.
Он используется для:
освобождения ресурсов
удаления наблюдателей
инвалидирования таймеров
логирования жизненного цикла
Пример:
deinit {
NotificationCenter.default.removeObserver(self)
}
Чаще всего это происходит из-за:
циклов сильных ссылок
замыканий, захватывающих self
делегатов без weak
ARC не умеет «догадываться» о логике — он опирается только на ссылки.
Важно помнить:
структуры и enum не имеют deinit
они уничтожаются при выходе из области видимости
ARC работает только с классами
Объект деинициализируется строго в момент, когда на него больше нет сильных ссылок. Если deinit не вызывается — почти всегда это признак утечки памяти.