Вопрос проверяет понимание проблемы утечек памяти в iOS, их причин, методов обнаружения и профилактики.
Утечка памяти происходит, когда объекты больше не нужны, но система не может их освободить, потому что на них остаются сильные ссылки. Частая причина — сильные ссылочные циклы (strong reference cycles), когда два объекта ссылаются друг на друга через сильные ссылки. Для поиска утечек используют Debug Memory Graph в Xcode и инструмент Leaks в Instruments. Чтобы избегать циклов, используют ключевые слова weak или unowned для создания слабых ссылок.
Утечка памяти (Memory Leak) — ситуация, когда память, выделенная под объект, не освобождается, даже если объект больше не используется приложением. Это может привести к исчерпанию памяти и аварийному завершению приложения.
Основная причина: Сильные ссылочные циклы
Цикл возникает, когда два объекта содержат сильные (strong) ссылки друг на друга, или когда замыкание захватывает сам объект, в котором оно определено, сильной ссылкой.
Пример цикла между объектом и замыканием:
class MyViewController: UIViewController {
var closure: (() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
// Замыкание захватывает `self` сильной ссылкой по умолчанию
closure = {
self.view.backgroundColor = .red // Сильная ссылка на `self`
}
}
// Объект `MyViewController` удерживает замыкание `closure`,
// а замыкание удерживает `MyViewController` -> цикл.
}Решение: Использование слабых ссылок (weak или unowned)
closure = { [weak self] in // Захватываем self слабой ссылкой
self?.view.backgroundColor = .red // Теперь self - опционал
}Инструменты для поиска утечек:
Debug Memory Graph (Xcode): Показывает визуальный граф объектов в памяти. Утечки часто видны как неожиданно большие группы связанных объектов.
Instruments - Leaks: Специализированный инструмент, который в реальном времени отслеживает выделение памяти и точно указывает на места утечек.