Некоторые вопросы об автоматическом подсчете ссылок в iOS5 SDK - PullRequest
134 голосов
/ 16 июня 2011

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

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

  2. Если я разрабатываю новое приложение для iOS 5 с использованием ARC, нужно ли мне выполнять какие-то проверки «ретро-совместимости»? то есть мне нужно будет проверить версию iOS и соответственно сохранить и отпустить вызов? Итак, в принципе, доступна ли ARC для всех версий iOS или только для iOS 5?

Ответы [ 5 ]

150 голосов
/ 16 июня 2011

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

Да, но XCode 4.2 включает в себя новый инструмент «Migrate to Objective-C ARC» (в меню «Правка-> Рефакторинг»), который сделает это за вас. Вызов колллока - это отдельная история. Как упоминалось в комментариях, ссылка на 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, мне нужно будет реализовать некоторые что-то типа проверки «ретро-совместимости»? Т.е .: мне нужно будет проверить версию iOS и удержание вызова и отпуск соответственно? Итак, в основном, ARC доступно для всех версий iOS или просто для iOS 5?

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

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

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

8 голосов
/ 02 мая 2012

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

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

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

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

7 голосов
/ 16 июня 2011

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

5 голосов
/ 12 октября 2011

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

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

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

2 голосов
/ 07 ноября 2011

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

...