Бывало такое? Вы открыли экран, закрыли его, а память не освободилась. Сделали так 10 раз и приложение упало.
Поздравляю, у вас Memory Leak (Утечка памяти).
Это происходит, когда объект (например, тяжелая
Activity или ViewController) уже не нужен пользователю, но сборщик мусора (GC) не может его удалить, потому что кто-то другой всё еще держит на него ссылку.Главные причины утечек (Checklist):
🛑 Android:
1. Static Context: Никогда не сохраняйте
Context или View в статические переменные!• Плохо:
companion object { var myView: TextView? = null } - это удержит всю Activity в памяти навсегда.2. Забытые слушатели: Если вы подписались на синглтон (
LocationManager.addListener(this)), но забыли отписаться в onDestroy - Activity останется жить вечно.3. Внутренние классы: Анонимные классы (например,
Handler или AsyncTask) неявно хранят ссылку на внешний класс.🛑 iOS:
1. Retain Cycles (Циклы сильных ссылок):
Объект А держит Б, а Б держит А. Они никогда не удалятся.
• Классика: Вы передали
self внутрь замыкания (closure), которое сохранено в свойстве этого же класса.• Лечение: Всегда используйте
[weak self] внутри клоужеров, если есть риск цикла.🛠 Инструменты для поиска (Без них вы слепы):
🐤 Android - LeakCanary:
Библиотека от Square. Must-have в любом debug-билде.
Она автоматически следит за Activity/Fragment. Если происходит утечка, она присылает уведомление (буквально кричит), дампит память и показывает красивое дерево ссылок: кто именно держит ваш объект.
📊 iOS - Memory Graph Debugger:
В Xcode есть встроенная кнопка (три шарика, соединенных линиями) в нижней панели дебага.
Нажимаете её во время работы приложения - и Xcode показывает граф всех объектов в памяти. Ищите фиолетовые восклицательные знаки (⚠️) - это утечки.
💡 Совет: Утечки памяти коварны тем, что на мощном телефоне разработчика они незаметны. А у пользователя на старом Android с 3 ГБ RAM приложение вылетит через 5 минут. Проверяйте память хотя бы раз в спринт.
А вы используете
[weak self] везде «на всякий случай» или только там, где нужно? 👇#memory #performance #leaks #leakcanary #ios #android #middle #optimization
👉 @developer_mobila
