воскресенье, 8 января 2012 г.

Введение в ARC

Вступление можно и не читать.

За последние полгода разработки под apple устройства постоянно натыкаюсь на то, что мало кто из знакомых коллег понимает новую технологию работы с памятью в XCode. Мне и самому не до конца понятно как там все закручено, но все таки некоторые моменты постараюсь описать, заодно сам разберусь что к чему. Все картинки и примеры приведены для XCode 4.2.1 (4D502). Для тех кто в танке, ARC - Automatic Reference Counting. Итак поехали.



О чем речь?

ARC - встроенная в компилятор LLVM технология, которая совмещает прелести автоматического сборщика мусора GC и высокую скорость работы ручного управления памяти (retain/release). Работа с ARC напоминает работу на языке программирования со встроенным сборщиком мусора. Теперь почти не надо заботиться об утечках памяти, не нужно помнить и просчитывать когда отпускать/захватывать переменную и не надо помнить об assign свойствах. Кода становится меньше, а стабильность и скорость выполнения программы увеличивается. Все это стало возможным благодаря компилятору LLVM. На этапе предкомпиляции LLVM сам вставляет в нужных местах retain, release и autorelease. Естественно необходимо следовать некоторым правилам, чтобы ARC сработал корректно и не добавлял лишних операция с циклическими ссылками. О правилах я напишу в следующий раз. И что самое потрясающее - на надо выкидывать старый код программы. Можно постепенно внедрить в него технологию ARC, так что пользователи и заказчики вообще ничего не заметят. Резюмируя все вышесказанное:



Главные прелести ARC

  • Не надо использовать retain и release ВООБЩЕ!!!
  • ARC не создает дополнительных поток для удаления мусора
  • Легко понять принципы, если не вдаваться в детали
  • LLVM делает серьезную оптимизацию кода, после чего программа работает даже быстрее, чем с ручным управлением памяти.
  • Есть инструменты для постепенного внедрения ARC в существующую программу
  • Появились крайне полезные слабые связи для свойств. Раньше это было доступно только для переменных.
  • Меньше EXC_BAD_ACCESS вылетов. Программа работает стабильнее и быстрее
  • Другие плюшки по вкусу…


Как включить?

Xcode версии 4 и выше поумолчанию использует компилятор LLVM, который в свою очередь тянет за собой использование ARC. На картинке показано какой флаг включает ARC.

LLVM ARC Preference

Если нужно использовать ARC не для всех классов, то достаточно этому классу выставить флаг -fno-objc-arc и этот класс будет скомпилирован без ARC. Чтобы выставить флаг нажно зайти в настройки таргета во вкладку Build Phases и там конкретному файлу установить флаг, как на картинке.

Unset ARC flag


продолжение скоро будет


Источники