Утечки памяти во Flutter
Вопрос
Как появляются утечки памяти во Flutter-приложении и как вы их находите?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Неотменённые подписки, таймеры и слушатели держат `State` после `dispose`
Неосвобождённые контроллеры (`AnimationController`, `TextEditingController`, `ScrollController`)
Замыкания, сохранённые в долгоживущих объектах (синглтоны, кеши)
Большие изображения и неограниченные кеши
Поиск: DevTools Memory, сравнение снимков, `leak_tracker` в тестах
Профилактика: линтеры, правило «создал в initState, освободил в dispose»
Что могут спросить следом
- Как найти, кто держит объект?
- Почему GlobalKey может привести к утечке?
Разбор
Образцовый ответ: «Утечка во Flutter обычно означает, что State или крупный объект недостижим для пользователя, но достижим для сборщика. Чаще всего его держит колбэк: подписка на Stream, слушатель контроллера, таймер или сохранённое в синглтоне замыкание. Вторая группа: контроллеры без dispose, они ещё и держат тикеры. Третья: кеши без ограничений и картинки в полном разрешении. Ищу так: в DevTools Memory делаю снимок, открываю и закрываю экран несколько раз, делаю второй снимок и сравниваю, каких классов стало больше, затем смотрю путь удержания. В тестах подключаю leak_tracker. Профилактика простая: всё, что создано в initState, освобождается в dispose, а сервисы с подписками имеют свой dispose»
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.