Ответ
Зомби-объект — это объект, память которого была освобождена (deallocated), но на который сохранилась "живая" ссылка. Попытка обращения по этой ссылке приводит к неопределённому поведению или крашу.
Причины появления:
- В Objective-C: Ошибки ручного управления памятью (MRC) или неправильное использование
unsafe_unretained. - В Swift: Использование
unownedпри обращении к уже освобождённому объекту или работа с небезопасными указателями (UnsafePointer).
Инструменты для отладки:
- NSZombieEnabled (Objective-C): Флаг среды, который превращает освобождённые объекты в "зомби", логируя обращение к ним вместо немедленного краша.
- Диагностика памяти в Xcode: Инструменты "Address Sanitizer" и "Zombie Objects" помогают находить такие ошибки.
Пример опасного кода на Swift:
class DataManager {
func process() { print("Processing...") }
}
var unownedManager: Unowned<DataManager>? // Аналог unowned reference
func createManager() {
let manager = DataManager() // Создаётся объект
unownedManager = .some(manager)
// manager выходит из области видимости и деинициализируется
}
createManager()
// Попытка доступа к освобождённой памяти -> КРАШ
// unownedManager!.value.process() // Runtime error: bad access
Как избежать:
- Предпочитайте
weakссылкиunowned, если есть вероятность, что объект может быть освобождён. - Используйте
weakдля делегатов и обратных вызовов. - Включайте инструменты санитизации памяти во время отладки.