К ARC или не к ARC? Каковы плюсы и минусы?

Я еще не использовал ARC, так как большая часть кода в проекте, над которым я сейчас работаю, была написана до iOS 5.0.

Мне просто интересно, удобство в том, чтобы не сохранять / отпускать вручную (и, предположительно, более надежный код, который приходит в результате?) Перевешивает любую «стоимость» использования ARC? Каковы ваши опыты в ARC, и вы бы порекомендовали его?

Так:

  • Сколько выгоды может принести ARC проекту?
  • Есть ли у ARC стоимость, например, assembly мусора на Java?
  • Вы использовали ARC, и если да, то как вы его нашли?

Нет недостатка. Используй это. Сделайте это сегодня. Это быстрее, чем ваш старый код. Это безопаснее, чем ваш старый код. Это проще, чем ваш старый код. Это не garbage collection. Он не имеет накладных расходов на время выполнения. Вставки компилятора сохраняются и освобождаются во всех местах, которые вы должны иметь в любом случае. Но он умнее вас и может оптимизировать те, которые на самом деле не нужны (так же, как он может разворачивать циклы, устранять временные переменные, встроенные функции и т. Д.),

Хорошо, теперь я расскажу вам о небольших минусах:

  • Если вы давний разработчик ObjC, вы будете дергаться около недели, когда увидите код ARC. Вы очень быстро справитесь с этим.

  • Есть некоторые (очень) небольшие осложнения при соединении с кодом Core Foundation. Есть несколько больше осложнений при работе со всем, что относится к id как к void* . Такие вещи, как C-массивы id могут немного подумать о том, чтобы сделать правильно. Необычное обращение с ObjC va_args также может вызвать проблемы. Большинство вещей, связанных с математикой на указателе ObjC, сложнее. Во всяком случае, вы не должны этого пережить.

  • Вы не можете поместить id в struct . Это довольно редко, но иногда оно используется для сбора данных.

  • Если вы не следовали правильному наименованию KVC, и вы смешиваете код ARC и не ARC, у вас будут проблемы с памятью. ARC использует имена KVC для принятия решений об управлении памятью. Если это все код ARC, то это не имеет значения, потому что он будет делать то же самое «неправильно» с обеих сторон. Но если это смешанный ARC / не-ARC, тогда есть несоответствие.

  • ARC будет утечка памяти во время сбоев исключения ObjC. Исключение ObjC должно быть очень близко к завершению вашей программы. Если вы перехватываете значительное количество исключений ObjC, вы используете их неправильно. Это можно -fobjc-arc-exceptions с использованием -fobjc-arc-exceptions , но оно предусматривает штрафы, которые обсуждаются ниже:

  • ARC не будет утечка памяти во время исключения ObjC или C ++ в коде ObjC ++, но это связано как с производительностью времени, так и с пространством. Это еще один из длинного списка причин, чтобы свести к минимуму использование ObjC ++.

  • ARC не будет работать вообще на iPhoneOS 3 или Mac OS X 10.5 или ранее. (Это исключает возможность использования ARC во многих проектах.)

  • __weak работают неправильно на iOS 4 или Mac OS X 10.6, что является позором, но довольно легко работать. __weak отличные, но они не являются точкой продажи № 1 ARC.

Для 95% + кода там ARC является блестящим, и нет причин вообще его избегать (при условии, что вы можете использовать ограничения версии ОС). Для кода, отличного от ARC, вы можете передавать -fno-objc-arc в файл за файлом. К сожалению, Xcode делает это намного сложнее, чем нужно делать на практике. Вероятно, вы должны перенести не-ARC-код в отдельный xcodeproj, чтобы упростить это.

В заключение, переключитесь на ARC, как только сможете и не оглядитесь назад.


РЕДАКТИРОВАТЬ

Я видел пару комментариев по строкам «использование ARC не заменит знание правил управления памятью Cocoa». Это в основном верно, но важно понять, почему и почему нет. Во-первых, если весь ваш код использует ARC, и вы нарушаете три волшебных слова повсюду, у вас все равно не будет проблем. Шокировать, чтобы сказать, но там вы идете. ARC может сохранить некоторые вещи, которые вы не имели в виду, чтобы сохранить их, но они также выпустят их, поэтому это никогда не имеет значения. Если бы сегодня я преподавал новый class в Cocoa, я бы, вероятно, потратил не более пяти минут на фактические правила управления памятью, и я бы, вероятно, упомянул только правила управления именами при обсуждении имен KVC. С ARC я считаю, что вы действительно можете стать достойным начинающим программистом, не изучая правила управления памятью вообще.

Но вы не могли стать достойным промежуточным программистом. Вы должны знать правила, чтобы правильно сфокусироваться с Core Foundation, и каждый промежуточный программист должен иметь дело с CF в какой-то момент. И вам нужно знать правила для смешанного кода ARC / MRC. И вам нужно знать правила, когда вы начинаете возиться с указателями void* с id (что вам по-прежнему необходимо выполнять KVO правильно). И блоки … ну, управление блочной памятью просто странно.

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

Лучше, больше технических ответов, чем мое, придет, но здесь идет:

  • ARC! = Сбор мусора. Отсутствует штраф за выполнение, это делается во время компиляции.
  • ARC также! = Просто автоматическое освобождение всего, как вы предлагаете в своем комментарии. Прочтите документы
  • Это потрясающе, когда вы понимаете, сколько ручного справочного управления вы делаете
  • Используй это!
  • Один недостаток – сохранение старого, не дугового кода внезапно становится очень утомительным.

Сколько выгоды может принести ARC проекту?

Преимущество – значительная степень защиты от ошибок управления общей памятью. Утечки, вызванные неспособностью освободить объект и сбои из-за неспособности сохранить или преждевременно освободить объект, должны быть значительно уменьшены. Вам все еще нужно понять модель подсчитанной модели ссылок, чтобы вы могли classифицировать свои ссылки как сильные или слабые, избегать циклов сохранения и т. Д.

Сколько стоит assembly мусора?

В iOS нет сборки мусора. ARC похож на GC, так как вам не нужно вручную сохранять или отпускать объекты. В отличие от GC, в нем нет сборщика мусора. Модель сохранения / выпуска по-прежнему применяется, просто компилятор вставляет в ваш код соответствующие вызовы управления памятью во время компиляции.

Вы использовали ARC, и если да, то как вы его нашли?

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

Единственная проблема с ARC заключается в том, что она не поддерживается в более старых версиях iOS, поэтому вам нужно принять это во внимание, прежде чем вы решите ее принять.

Я думаю, что ARC – отличная идея. По сравнению с GC вы можете получить свой торт и съесть его тоже. Я склонен полагать, что MRC налагает бесценную «дисциплину» на управление памятью, которую каждый может извлечь из этого. Но я также согласен с тем, что реальная проблема, о которой нужно знать, – это Object Ownership and Object Graphs (как многие указали), а не подсчеты на уровне низкого уровня как таковой.

В заключение: ARC НЕ является свободным пропуском для бессмысленной памяти; это инструмент, помогающий людям избежать повторяющихся задач, которые вызывают стресс и подвержены ошибкам, поэтому лучше делегировать машину (в этом случае компилятор).

Тем не менее, я лично являюсь мастером и еще не сделал переход. Я только начал использовать Git …

UPDATE: Итак, я перенес всю свою игру, включая библиотеку gl, и никаких проблем до сих пор (кроме помощника по миграции в Xcode 4.2). Если вы начинаете новый проект, подойдите к нему.

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

Следует обратить внимание на то, что вам нужно научиться делать: s и не делать: s слабых ссылок не вызывать каких-либо опорных циклов, если вы сами кодируете свой интерфейс, дизайнер, как правило, хорошо справляется с этим автоматически, если вы настроите свой графический интерфейс.

Единственный недостаток, с которым я столкнулся, – это использовать библиотеку с множеством функций и данных CoreFoundation. В MRC вам не нужно беспокоиться об использовании CFStringRef вместо NSString* . В ARC вы должны указать, как эти два взаимодействуют (базовый мост? Освобождают объект CoreFoundation и перемещают его в ARC? Создайте объект Cocoa в качестве сохраняемого объекта +1 CoreFoundation?) Кроме того, в OS X он доступен только на 64- (хотя у меня есть заголовок, который работает вокруг этого …).

  • Может ли iPhone приложение блокировать телефонные звонки?
  • канонический способ рандомизации NSArray в Objective C
  • Проблема автосохранения кадра UICollectionViewCell contentView в ячейке прототипа Storyboard (Xcode 6, iOS 8 SDK) происходит при запуске только на iOS 7
  • Сортировка NSArray пользовательских объектов по их свойствам NSDate
  • Сравнение поплавковых и двойных типов данных в объекте C
  • Как изменить формат даты в подборщике даты
  • Рисование поэтапно в UIView (iPhone)
  • Анимированный gif не работает в наложении MKMapView с использованием MKOverlayRenderer
  • как правильно использовать insertRowsAtIndexPaths?
  • Как распределить приложение ios без проводов без управления UDID и перекомпиляции
  • Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
  • Interesting Posts

    Зачем использовать !! при преобразовании int в bool?

    Недостаток глушителя в Mac OSX 10.9, IDE: создатель QT

    Как изменить значение по умолчанию для совместного использования экрана / номера порта VNC в Mac OS X?

    Чтение UTF-8 – маркер спецификации

    Как программировать MKV с субтитрами?

    Обозначение с левой стороны вместо поля ввода

    std :: map, указатель на значение ключа карты, возможно ли это?

    Добавьте несколько изображений в тело электронной почты (inline) с помощью приложения windows c #

    Amazon EC2, mysql прерывает запуск, потому что InnoDB: mmap (x bytes) не удалось; errno 12

    Как сделать мой постоянный шлюз постоянным в CentOS? Чтобы после перезагрузки он не потерялся

    Как установить контрольную точку в Eclipse в сторонней библиотеке?

    Как работает getchar ()?

    Google Spreadsheet: сценарий для изменения цвета строки, когда ячейка меняет текст;

    Как создавать файлы субтитров и добавлять их в видео?

    Когда инициализация статических переменных в C #?

    Давайте будем гением компьютера.