Ответ
Счетчик сильных ссылок управляется автоматически (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 — это основные способы явно избежать увеличения счетчика ссылок для предотвращения циклов сильных ссылок или ручного управления памятью.