Ответ 1
Нет недостатка. Используй это. Сделайте это сегодня. Это быстрее, чем ваш старый код. Это безопаснее, чем ваш старый код. Это проще, чем ваш старый код. Это не сбор мусора. Он не имеет накладных расходов на время выполнения. Вставки компилятора сохраняются и освобождаются во всех местах, которые вы должны иметь в любом случае. Но он умнее вас и может оптимизировать те, которые на самом деле не нужны (так же, как он может разворачивать циклы, устранять временные переменные, встроенные функции и т.д.).
ОК, теперь я расскажу вам о небольших минусах:
-
Если вы давний разработчик ObjC, вы будете подергиваться примерно на неделю, когда увидите код ARC. Вы очень быстро справитесь с этим.
-
Есть некоторые (очень) небольшие осложнения при соединении с кодом Core Foundation. Есть несколько больше осложнений при работе со всем, что относится к
id
как кvoid*
. Такие вещи, как C-массивыid
, могут немного подумать о том, чтобы сделать правильно. Необычное обращение с ObjCva_args
также может вызвать проблемы. Большинство вещей, связанных с математикой на указателе ObjC, сложнее. В любом случае вы не должны этого многого. -
Вы не можете поместить
id
вstruct
. Это довольно редко, но иногда оно используется для сбора данных. -
Если вы не выполнили правильное именование KVC, и вы смешиваете код ARC и не ARC, у вас будут проблемы с памятью. ARC использует имена KVC для принятия решений об управлении памятью. Если это весь код ARC, то это не имеет значения, потому что это сделает то же самое "неправильное" с обеих сторон. Но если он смешивается с ARC/не-ARC, тогда существует несоответствие.
-
ARC будет утечка памяти во время сбоев исключения ObjC. Исключение ObjC должно быть очень близко к завершению вашей программы. Если вы перехватываете значительное количество исключений ObjC, вы используете их неправильно. Это можно устранить с помощью
-fobjc-arc-exceptions
, но оно предусматривает штрафные санкции, обсуждаемые ниже: -
ARC не будет утечка памяти во время исключения ObjC или С++ в коде ObjС++, но это связано как с производительностью времени, так и с пространством. Это еще один из длинного списка причин, чтобы свести к минимуму использование ObjС++.
-
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, и вы нарушаете Three Magic Words повсюду, у вас все равно не будет проблем. Шокировать, чтобы сказать, но там вы идете. ARC может сохранить некоторые вещи, которые вы не имели в виду, чтобы сохранить их, но они также выпустят их, поэтому это никогда не имеет значения. Если бы я преподавал новый класс в Cocoa сегодня, я бы, вероятно, потратил не более пяти минут на фактические правила управления памятью, и я бы, вероятно, упомянул только правила управления именами при обсуждении имен KVC. С ARC я считаю, что вы действительно можете стать достойным начинающим программистом, не изучая правила управления памятью вообще.
Но вы не могли стать достойным программистом. Вы должны знать правила, чтобы правильно сфокусироваться с Core Foundation, и каждый промежуточный программист должен иметь дело с CF в какой-то момент. И вам нужно знать правила для смешанного кода ARC/MRC. И вам нужно знать правила, когда вы начинаете возиться с указателями void*
до id
(которые вы по-прежнему должны выполнять для KVO правильно). И блоки... ну, управление блочной памятью просто странно.
Итак, я хочу сказать, что основное управление памятью по-прежнему важно, но там, где я обычно тратил значительное время и формулировал правила для новых программистов, ARC становится более продвинутой темой. Я предпочел бы, чтобы новые разработчики думали с точки зрения графиков объектов, а не заполняли их основными вызовами на objc_retain()
.