В чем разница между Objective-C автоматическим подсчетом ссылок и сборкой мусора? - PullRequest
55 голосов
/ 24 октября 2011

С новым автоматическим подсчетом ссылок (ARC), представленным в Xcode 4.2, нам больше не нужно вручную управлять сохранением / деблокированием в Objective-C.

Это похоже на сборку мусора, как в Objective-C на Mac и на других языках. Чем ARC отличается от сборки мусора?

Ответы [ 4 ]

63 голосов
/ 25 октября 2011

Как я опишу в своем ответе здесь , ARC может обеспечить лучшее как ручное управление памятью, так и отслеживание сбора мусора.В основном это устраняет необходимость для разработчика отслеживать отслеживание, выпуск и автоматическое высвобождение объектов Objective-C вручную, но в то же время устраняет необходимость в процессе сборки мусора, который может использовать ограниченные ресурсы на мобильном устройстве и вызывать случайные сбои в работающем приложении..

ARC вставляет соответствующие сохранения и выпуски, необходимые для подсчета ссылок во время компиляции, применяя правила, которые все разработчики Objective-C должны были использовать в течение многих лет.Это освобождает разработчика от необходимости самим управлять этим.Поскольку сохранения и освобождение вставляются во время компиляции, не требуется никакого процесса сборщика для непрерывной очистки памяти и удаления объектов, на которые нет ссылок.

Одним небольшим преимуществом трассировки сборки мусора по сравнению с ARC является то, что ARC не будет иметь делос циклами сохранения для вас , где отслеживание сбора мусора может их забрать.

Отличное чтение по этой теме происходит из этой цепочки в списке рассылки Apple Objective-C , где КрисЛаттнер говорит следующее:

Основное преимущество GC перед ARC состоит в том, что он собирает циклы сохранения.Второе преимущество заключается в том, что «сохраненные» назначения являются «атомарными», поскольку они являются простым хранилищем.ARC имеет несколько больших преимуществ по сравнению с libauto GC: * ​​1016 *

  1. Он имеет детерминированную рекультивацию объектов (когда исчезает последняя сильная ссылка на объект), где GC освобождает объект «некоторое время спустя».Это определяет класс скрытых ошибок, которые могут существовать в приложениях GC, которые не отображаются, потому что сборщик не срабатывает «в окне с ошибками».
  2. Максимальная отметка обычно намного ниже с ARC, чемGC, потому что объекты высвобождаются быстрее.
  3. libauto предоставляет хрупкую модель программирования, вы должны быть осторожны, чтобы не потерять барьеры записи и т. Д.
  4. не все системные платформы являются чистыми GC, ифреймворки иногда регрессируют по мере своего развития.
  5. ARC не страдает от ложных корней.libauto консервативно сканирует стек, а это означает, что целые числа, которые выглядят как указатели, могут корневые графы объектов.
  6. ARC не имеет ничего, что могло бы привести к остановке приложения и вызвать остановку пользовательского интерфейса.libauto довольно продвинут в реализации GC, потому что он не останавливает сразу все потоки, но обычно все равно останавливает все потоки пользовательского интерфейса.

В настоящее время я переношу обамои проекты, управляемые вручную из памяти, а также проекты, использующие сборку мусора Objective-C, в ARC.Некоторое время спустя после использования сборки мусора в нескольких приложениях Mac я вижу некоторые существенные преимущества при переносе этих проектов в ARC.

12 голосов
/ 04 сентября 2016

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

GC основаны на "достижимых" объектах на основе среды выполнения, которые делают его эффективным в многопоточной среде.

Операция

ARC внедряет код в исполняемый файл, который будет выполняться "автоматически" на неиспользуемых объектах, в зависимости от их количества ссылок.

GC работает во время выполнения, так как он обнаружитнеиспользуемые графы объектов (устранят циклы сохранения) и удаляют их через неопределенные промежутки времени

Преимущества автоматического подсчета ссылок

  • Детерминированное уничтожение объектов в реальном времени по мере их появленияне используется.
  • Нет фоновой обработки.

Преимущества сборки мусора

  • GC может очищать целые графы объектов, включая циклы сохранения.
  • GC работает в фоновом режиме, поэтому в рамках обычного потока приложений выполняется меньше операций по управлению памятью.

Недостатки автоматического подсчета ссылок

  • ARC не может обрабатывать циклы сохранения автоматически.

Недостатки сборки мусора

  • Поскольку сборщик мусора происходит в фоновом режиме, точные временные рамки для освобождения объектов не определены.
  • Когда происходит сборщик мусора, другие потоки в приложении могут быть временно приостановлены.
7 голосов
/ 27 января 2014

Чем ARC отличается от сборки мусора?

ARC - это форма сборки мусора.

Вы, вероятно, имеете в виду «в чем разница между ARC и отслеживанием сборки мусора (например, JVM и .NET)?». Основные отличия в том, что ARC работает медленнее и имеет утечки циклов. Вот почему JVM и .NET используют трассировочные сборщики мусора. Для получения дополнительной информации, пожалуйста, прочитайте Как сравниваются подсчет ссылок и трассировка сборки мусора? .

0 голосов
/ 16 ноября 2011

Короткий и приятный ответ следующий:

GC для java - это Runtime, а ARC - для времени компиляции.

GC имеет ссылку на объекты во время выполнения и проверяет зависимостивремя выполнения объекта.В то время как ARC добавляет выпуск, сохраняются, автоматические вызовы во время компиляции.

...