Какая основная проблема при использовании ARC и когда возникает утечка памяти
Что проверяют
Понимаете ли вы, что ARC это не сборщик мусора, а расстановка retain и release компилятором на этапе сборки, и что у подсчёта ссылок ровно одна принципиальная дыра: цикл сильных ссылок разорвать некому. Спрашивают, чтобы уйти дальше в замыкания и [weak self], а потом в диагностику: как вы вообще узнали, что течёт.
Как отвечать
- механика: счётчик ссылок живёт в заголовке объекта, вызовы
retainиreleaseвставляет компилятор, при нуле срабатываетdeinit. Пауз на сборку нет, но и найти цикл рантайму нечем; - главная проблема: сильный цикл ссылок. Объект
AдержитB,BдержитA, счётчики не доходят до нуля; - weak: опциональная ссылка, обнуляется при освобождении объекта, чуть дороже из-за побочной таблицы;
- unowned: без опционала и без обнуления, обращение к освобождённому объекту это падение. Берут, только когда владелец гарантированно живёт дольше;
- захват в замыканиях: escaping-замыкание, сохранённое в свойстве, держит
selfсильно. Лечится списком захвата[weak self]и строкойguard let self else { return }; - делегаты:
weak var delegate: SomeDelegate?, протокол при этом должен быть ограниченAnyObject.
Назовите типовые места, где течёт на практике: Timer.scheduledTimer с целью self (таймер держит цель до invalidate), блочный наблюдатель NotificationCenter (нужно снимать по токену), sink в Combine, когда self хранит набор подписок, а замыкание захватывает self, и координаторы, которые не удаляют завершившихся детей.
Про инструменты: Memory Graph Debugger в Xcode показывает, кто именно держит объект, шаблон Leaks в Instruments ловит недостижимые циклы, а печать в deinit проверяет гипотезу за минуту.
Где спотыкаются
Ставят [weak self] во все замыкания подряд, включая non-escaping вроде map или UIView.animate, где цикл невозможен по определению.
Берут unowned, чтобы не писать guard let, и получают падение, когда экран закрывают раньше, чем возвращается ответ сети.
Путают утечку с растущим потреблением памяти. Неограниченный кэш или удержанные изображения это не цикл, Leaks их не покажет, и искать надо снимками в Allocations.