Как я опишу в своем ответе здесь , ARC может обеспечить лучшее как ручное управление памятью, так и отслеживание сбора мусора.В основном это устраняет необходимость для разработчика отслеживать отслеживание, выпуск и автоматическое высвобождение объектов Objective-C вручную, но в то же время устраняет необходимость в процессе сборки мусора, который может использовать ограниченные ресурсы на мобильном устройстве и вызывать случайные сбои в работающем приложении..
ARC вставляет соответствующие сохранения и выпуски, необходимые для подсчета ссылок во время компиляции, применяя правила, которые все разработчики Objective-C должны были использовать в течение многих лет.Это освобождает разработчика от необходимости самим управлять этим.Поскольку сохранения и освобождение вставляются во время компиляции, не требуется никакого процесса сборщика для непрерывной очистки памяти и удаления объектов, на которые нет ссылок.
Одним небольшим преимуществом трассировки сборки мусора по сравнению с ARC является то, что ARC не будет иметь делос циклами сохранения для вас , где отслеживание сбора мусора может их забрать.
Отличное чтение по этой теме происходит из этой цепочки в списке рассылки Apple Objective-C , где КрисЛаттнер говорит следующее:
Основное преимущество GC перед ARC состоит в том, что он собирает циклы сохранения.Второе преимущество заключается в том, что «сохраненные» назначения являются «атомарными», поскольку они являются простым хранилищем.ARC имеет несколько больших преимуществ по сравнению с libauto GC: * 1016 *
- Он имеет детерминированную рекультивацию объектов (когда исчезает последняя сильная ссылка на объект), где GC освобождает объект «некоторое время спустя».Это определяет класс скрытых ошибок, которые могут существовать в приложениях GC, которые не отображаются, потому что сборщик не срабатывает «в окне с ошибками».
- Максимальная отметка обычно намного ниже с ARC, чемGC, потому что объекты высвобождаются быстрее.
- libauto предоставляет хрупкую модель программирования, вы должны быть осторожны, чтобы не потерять барьеры записи и т. Д.
- не все системные платформы являются чистыми GC, ифреймворки иногда регрессируют по мере своего развития.
- ARC не страдает от ложных корней.libauto консервативно сканирует стек, а это означает, что целые числа, которые выглядят как указатели, могут корневые графы объектов.
- ARC не имеет ничего, что могло бы привести к остановке приложения и вызвать остановку пользовательского интерфейса.libauto довольно продвинут в реализации GC, потому что он не останавливает сразу все потоки, но обычно все равно останавливает все потоки пользовательского интерфейса.
В настоящее время я переношу обамои проекты, управляемые вручную из памяти, а также проекты, использующие сборку мусора Objective-C, в ARC.Некоторое время спустя после использования сборки мусора в нескольких приложениях Mac я вижу некоторые существенные преимущества при переносе этих проектов в ARC.