Некоторые вопросы об автоматическом подсчете ссылок в iOS5 SDK

В настоящее время я разрабатываю приложение для iPad. Разработка началась для iOS 4.2 и теперь продолжается (и, я думаю, будет завершена) для iOS 4.3. Я только что прочитал об ARC в iOS 5, и в основном я понял, что нам больше не нужно будет выпускать и сохранять объекты. Мои вопросы:

  • Если я решил перейти на iOS 5, мне нужно удалить все операторы [myObject retain] и [myObject release] из моего кода?

  • Если я разработаю новое приложение для iOS 5 с использованием ARC, мне нужно будет выполнить какие-то проверки "ретро-совместимости"? i.e: мне нужно будет проверить версию iOS и соответственно сохранить удержание и выпуск? Итак, в основном, ARC доступен для всех версий iOS или только для iOS 5?

Ответ 1

Если я решит перейти на iOS 5, необходимо удалить все [myObject сохранить] и [myObject release] из мой код?

Да, но XCode 4.2 включает новый инструмент "Миграция в Objective-C ARC" (в меню Edit- > Refactor), что делает это для вас. Вызов dealloc - это совсем другая история. Как упоминалось в комментариях, ссылка clang указывает, что вы должны сохранить свой метод dealloc:

Обоснование: несмотря на то, что ARC автоматически уничтожает переменные экземпляра, есть все еще законные причины для написания метода dealloc, например, освобождение не сохраняемых ресурсов. Невозможность вызвать [super dealloc] в таком методе почти всегда является ошибкой.

Вы активируете ARC, используя новую -fobjc-arc флаг компилятора. ARC поддерживается в Xcode 4.2 для Mac OS X v10.6 и v10.7 (64-разрядные приложения) и для iOS 4 и iOS 5. (Слабые ссылки не поддерживается в Mac OS X v10.6 и iOS 4). В Xcode нет поддержки ARC 4.1.

-

Если я разработаю новое приложение для iOS 5, используя ARC, мне нужно будет реализовать некоторые вроде "ретро-совместимости" чеков? I.e.: Мне нужно проверить версию iOS и сохранить и освободить вызов соответственно? Итак, в основном, это ARC доступный для всех версий iOS или просто для iOS 5?

Нет, потому что ARC делает свою магию во время компиляции, а не во время выполнения.

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

Дополнительная информация о ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Ответ 2

Q1: НЕТ. Если у вас есть существующий код, вы можете продолжать использовать его как есть с -fno-objc-arc, вы можете выборочно отключить ARC в любом файле.

Если вы хотите отключить ARC в файлах MULTIPLE:

  • Выберите желаемые файлы на этапах Target/Build/Compile Sources в Xcode
  • НАЖМИТЕ ВВОД. (двойной щелчок выбирает только один файл)
  • Тип -fno-objc-arc
  • Нажмите Ввести или Готово

Q2: NO, цель может быть такой же низкой, как iOS 4.0

Ответ 3

Насколько я понимаю, и насколько я уверен, что мой iPhone/iPod, работающий под управлением iOS 5 и iOS 4.3, работает совершенно автоматически. Приложение, которое я начал для 4.0 и "обновил" для работы с Xcode для iOS 5.0, никогда не бросает какие-либо предупреждения о пуске и сохранении, даже несмотря на то, что это все на каждом dealloc и т.д. Однако некоторые из того же кода, который я вставил (скопировал файл) в новый проект создан, а Xcode для iOS 5 содержит много предупреждений. Таким образом, вам не нужно удалять все эти вызовы, и нет, он каким-то образом автоматически адаптирует его для более старых версий. Профилирование моего iPod, я не вижу утечек памяти или других признаков сбоя deallocs/release. Помогает ли это?

Ответ 4

Относительно этой части вашего вопроса

Если я разработаю новое приложение для iOS 5 с использованием ARC, мне нужно будет реализовать какие-то проверки "ретро-совместимости"? I.e.: Мне нужно проверить версия iOS и соответственно сохранить и освободить вызов? Так, в основном, ARC доступен для всех версий iOS или только для iOS 5?

Следует отметить, что компилятор iOS 5 принимает "ретро-совместимость" (он фактически ADDS-код делает работу по сохранению/выпуску, по существу), но если вы не компилируете для iOS 5.0, вы не можете использовать weak в качестве ключевого слова. Вместо этого вы используете assign. Это печально: weak является огромным преимуществом (без каких-либо оборванных указателей!). См. Мой вопрос здесь для обсуждения weak, assign и ARC.

Ответ 5

Если вы можете отключить ARC, не используя новый флаг компилятора -fobjc-arc, тогда вы не будете вынуждены переписывать код вперед - я думаю (?)