Ответ
Memory leak (утечка памяти) — ситуация, когда объект больше не нужен, но не освобождается сборщиком мусора из-за сохранённых сильных ссылок. В Swift/Objective-C это часто происходит из-за retain cycles.
Основные причины:
- Retain cycles в замыканиях — когда замыкание захватывает
selfбезweak/unowned. - Сильные ссылки в делегатах — использование
strongвместоweakдля делегатов. - Неосвобождаемые ресурсы — таймеры, наблюдатели (observers), уведомления (notifications).
Пример retain cycle:
class ViewController: UIViewController {
var closure: (() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
// ПРОБЛЕМА: сильная ссылка на self → retain cycle
closure = {
self.doSomething()
}
}
}
Решение:
// 1. Используйте weak ссылку
closure = { [weak self] in
self?.doSomething()
}
// 2. Или unowned (если self гарантированно существует)
closure = { [unowned self] in
self.doSomething()
}
Инструменты для поиска утечек:
- Instruments → Leaks/Allocations — профилирование памяти в реальном времени
- Debug Memory Graph в Xcode — визуализация графа объектов
- Address Sanitizer — обнаружение ошибок работы с памятью
Best practices:
- Всегда используйте
weakдля делегатов и протоколов - Освобождайте ресурсы в
deinit(таймеры, наблюдатели) - Проверяйте retain cycles при использовании замыканий