Когда изменяется счетчик ссылок (retain count) объекта?

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

Ответ

Счетчик ссылок изменяется при выполнении операций владения. В ручном управлении памятью (MRC) — при явных вызовах. В ARC — при событиях, которые компилятор транслирует в эти вызовы.

Операции, увеличивающие счетчик (retain):

  • Присваивание объекта сильной (strong) ссылке.
  • Помещение объекта в коллекцию (массив, словарь), которая хранит сильные ссылки.
  • Явный вызов retain (в MRC).

Операции, уменьшающие счетчик (release):

  • Сильной ссылке присваивается nil или другой объект.
  • Сильная ссылка выходит из области видимости (конец функции, блока).
  • Объект удаляется из коллекции.
  • Владеющий объект (например, родительский UIView) сам деаллоцируется.
  • Явный вызов release (в MRC).

Псевдокод жизненного цикла в ARC:

// Компилятор генерирует примерно такой код:
class MyObject {}

func createObject() {
    let obj = MyObject()          // retain(obj) -> count = 1
    use(obj)
    // Конец области видимости `obj` -> release(obj) -> count = 0 -> deinit
}

Почему это важно: Понимание этих моментов помогает избегать retain cycles (когда два объекта держат сильные ссылки друг на друга, и счетчик никогда не падает до нуля).