В каких случаях счетчик сильных ссылок (retain count) на объект в ARC не увеличивается?

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

Ответ

Счетчик сильных ссылок управляется автоматически (ARC), но есть ситуации, когда его увеличение (retain) не происходит:

  • weak и unowned ссылки:

    weak var weakRef: MyClass? = object // Не увеличивает retain count
  • Unmanaged<T>: Прямая работа с объектами Core Foundation или обход ARC.

    let unmanaged = Unmanaged.passUnretained(object)
  • Временные объекты в autorelease pool: Объект может быть создан и возвращен без явного владения вызывающим кодом, временно находясь в пуле.

  • Оптимизации компилятора: ARC может опускать пары retain/release, если анализ потока данных доказывает, что объект гарантированно жив в нужной области видимости.

  • Захват в замыкании по weak/unowned:

    closure = { [weak self, unowned delegate] in
        self?.doSomething() // retain count self не увеличен
        delegate.call() // retain count delegate не увеличен
    }
  • Некоторые Core Foundation объекты (CFTypeRef): Не участвуют в ARC Swift, если для них не используется toll-free bridging.

Ключевой вывод: Использование weak/unowned и Unmanaged — это основные способы явно избежать увеличения счетчика ссылок для предотвращения циклов сильных ссылок или ручного управления памятью.