В чем преимущества и недостатки использования нового стиля управления автоматической подсчетом ссылок (ARC) в проекте iOS?
Выполнение программы ARC почти идентично хорошо написанному MRC. То есть различия в поведении часто не поддаются определению, поскольку как порядок операций, так и производительность очень близки.
Если вы уже знаете, как реализовать приложения OS X или iOS с ручным подсчетом ссылок (MRC), ARC на самом деле не добавляет функциональности - это просто позволяет вам удалить операции подсчета ссылок из ваших источников.
Если вы не хотите изучать MRC, вы можете сначала попробовать ARC. Многие люди борются с или пытаются игнорировать распространенные практики MRC (пример: я представил несколько разработчиков objc для статического анализатора). Если вы хотите избежать этих проблем, ARC позволит вам отложить ваше понимание; вы не можете писать нетривиальные программы objc без понимания подсчета ссылок и сроков жизни и отношений, будь то MRC, ARC или GC. ARC и GC просто удаляют реализацию из ваших источников и делают правильную вещь в большинстве случаев. С ARC и GC вам все равно нужно будет дать некоторые рекомендации.
Я не оценил это, но, возможно, стоит упомянуть, что компиляция Источники ARC потребуют больше времени и ресурсов.
Если программа, которую вы разрабатываете, имеет довольно свободное использование подсчета ссылок (например, типичное количество авторелеаз), переход на ARC может действительно улучшить время выполнения вашей программы и использовать максимальную память.
Можете ли вы не использовать ARC при разработке с iOS 5.0 SDK?
Да, используя CLANG_ENABLE_OBJC_ARC. ARC совместим с двоичными файлами, и все, что действительно происходит, заключается в том, что компилятор делает все возможное, чтобы автоматически вводить соответствующие операции подсчета ссылок для вас на основе деклараций, видимых для текущего перевода (see my answer here as to why translation visibility is important). Поэтому вы можете также включить и отключить его для некоторых источников в проекте и включить его для других.
Смешанный режим (некоторые источники MRC и некоторые источники ARC), однако, довольно сложный и тонко, особенно для реализаций, которые могут быть дублированы компилятором (например, тело встроенной функции может быть неправильным). Такие проблемы с смешанным режимом будут очень трудно изолировать. Программы и источники ObjC++ будут , в частности сложными в этом отношении. Кроме того, поведение может отличаться в зависимости от настроек оптимизации (как один пример); программа, которая отлично работает в сборке отладки, может ввести утечку или зомби в выпуске.
Вы рекомендуете ARC или ручной подсчет ссылок (MRC) для нового проекта?
Лично я буду придерживаться MRC в течение некоторого времени. Даже если ARC был протестирован в реальном мире, скорее всего, останется ряд проблем, которые появятся в сложных сценариях, которые вы хотите избежать, чтобы быть первыми, кто знал и отлаживал. Коллекция мусора OS X - пример того, почему вы можете подождать. В качестве одного из примеров коммутатор может измениться при уничтожении объектов - ваши объекты могут быть уничтожены раньше и никогда не будут помещены в пулы автозапуска. Он также может изменить порядок, в котором выпущены ивары, которые могут иметь некоторые побочные эффекты.
У меня также есть большая база кода, в которой я не хочу терять неделю тестирование этой функции в настоящее время. Наконец, для меня важна обратная совместимость.
Будет ли приложение, использующее ARC, работать на более старых версиях ОС, чем iOS 5.0?
Если вы разрабатываете MRC, он будет обратно совместим. Если вы работаете с ARC, это не обязательно будет совместимо. Фактически, он может даже не компилироваться без небольшой дополнительной работы. Требования к среде исполнения доступны в некоторых более ранних версиях. See also this question. Если вам нужна обратная совместимость, ARC не будет вариантом для некоторых версий ОС.
Наконец, если бы вы ограничили выбор GC или ARC, я бы рекомендовал ARC.
У вас есть несколько вопросов, два из которых рассматриваются в вопросах [Как работает новый механизм автоматического учета ссылок?] (Http://stackoverflow.com/questions/6385212/how-does-the-new- автоматический-отсчет-счет-механизм-работа) и [Xcode 4.2 с ARC: будет ли мой код работать даже на устройствах iOS с прошивкой старше 5.0?] (http://stackoverflow.com/questions/7768861/xcode-4-2 -with-arc-will-my-code-run-even-on-ios-devices-with-firmware-old-tha) –