Когда объект уничтожается в ARC (Swift)?

«Когда объект уничтожается в ARC (Swift)?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В ARC объект уничтожается (деинициализируется) в момент, когда количество сильных (strong) ссылок на него становится равным нулю.

Основные сценарии:

  1. Удаление последней сильной ссылки: Присвоение nil переменной или свойству, которое было последней сильной ссылкой на объект.
  2. Выход из области видимости: Локальная переменная, удерживающая объект, уничтожается при завершении выполнения области (например, функции).
  3. Обнуление weak-ссылки: Если объект удерживался только через weak-ссылку, он уничтожается немедленно. Сама weak-ссылка автоматически становится nil.

Пример:

class MyClass {
    deinit { print("Объект уничтожен") }
}

func testScope() {
    let obj = MyClass() // retain count = 1
} // Выход из области видимости -> release -> deinit

var strongRef: MyClass? = MyClass() // retain count = 1
weak var weakRef = strongRef // retain count не увеличивается
strongRef = nil // retain count становится 0 -> deinit. weakRef автоматически становится nil

Почему это важно: Понимание момента деинициализации критично для предотвращения утечек памяти и корректного освобождения ресурсов (закрытия файлов, остановки таймеров) в методе deinit.