Вопрос проверяет понимание ограничений ARC и принципов работы reference counting.
ARC работает только с количеством ссылок, а не с логикой связей. Он не анализирует граф объектов целиком. Для ARC retain cycle выглядит как корректное состояние. Автоматическое разрывание таких связей могло бы привести к ошибкам. Поэтому ответственность за это лежит на разработчике.
ARC — это предсказуемый и простой механизм, но именно из-за этого у него есть ограничения.
ARC освобождает объект только в одном случае:
когда счетчик сильных ссылок равен нулю
ARC не:
анализирует граф объектов
не ищет циклы
не понимает «кто кому нужен»
Retain cycle — это ситуация, когда:
объект A сильно ссылается на объект B
объект B сильно ссылается на объект A
С точки зрения ARC:
оба объекта используются
счетчик ссылок больше нуля
удалять ничего нельзя
Нет информации о намерениях
ARC не знает, является ли связь временной или логически необходимой.
Риск удаления нужных объектов
Автоматическое разрывание ссылок может привести к крашу или некорректному состоянию.
Производительность
Анализ графа объектов в runtime был бы дорогим.
Разработчик должен:
использовать weak или unowned ссылки
аккуратно работать с замыканиями
проектировать зависимости осознанно
ARC не устраняет retain cycle, потому что не может безопасно определить, какие ссылки допустимо разрывать без нарушения логики приложения.