Что такое зомби-объект (zombie object) в iOS/macOS?

«Что такое зомби-объект (zombie object) в iOS/macOS?» — вопрос из категории Управление памятью, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Зомби-объект — это объект, память которого была освобождена (deallocated), но на который сохранилась "живая" ссылка. Попытка обращения по этой ссылке приводит к неопределённому поведению или крашу.

Причины появления:

  1. В Objective-C: Ошибки ручного управления памятью (MRC) или неправильное использование unsafe_unretained.
  2. В 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 для делегатов и обратных вызовов.
  • Включайте инструменты санитизации памяти во время отладки.