Когда объект удаляется из памяти в системе с подсчётом ссылок (ARC)?

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

Ответ

Объект удаляется (деаллоцируется) в тот момент, когда его счетчик сильных (strong) ссылок достигает нуля. В ARC (Automatic Reference Counting) компилятор автоматически вставляет вызовы retain и release.

Типичные сценарии:

  1. Локальной переменной выходит из области видимости.
  2. Свойству класса или другой сильной ссылке присваивается nil или новый объект.
  3. Массив, словарь или другая коллекция, содержащая объект, удаляется или очищается.
  4. Цикл сильных ссылок (retain cycle) предотвращает обнуление счетчика, вызывая утечку памяти.

Пример:

class MyClass {}

func example() {
    var strongRef: MyClass? = MyClass() // Retain count = 1
    weak var observer = strongRef       // Weak ссылка НЕ увеличивает счетчик

    strongRef = nil // Retain count становится 0 -> объект немедленно удаляется.
    // Ссылка `observer` автоматически становится `nil`.
}

Важно: Само удаление из памяти может произойти немедленно или быть отложенным, но логически объект считается несуществующим с момента обнуления счетчика.