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


134

В настоящее время я разрабатываю приложение для 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?

Ответы:


150

Если я решу перейти на 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 4.1 нет поддержки ARC.

-

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

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

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

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


Спасибо за ваше объяснение!
Luke47

4
Это не на 100% правильно. Существует переключатель компилятора, который определяет, включен ли ARC или нет. Кроме того, я считаю, что ARC требуется некоторая поддержка во время выполнения, поэтому, если вы хотите, чтобы ваше приложение работало на iOS 4.x, вам нужно оставить в своих хранилищах и выпусках и убедиться, что ARC выключен.
JeremyP

8
@JeremyP - iOS 4.0 действительно поддерживается в качестве цели для приложений ARC, поэтому нет необходимости хранить код с ручным подсчетом ссылок для обращения к этой старой платформе. Возможно, iPhone OS 3.x, но я предполагаю, что Apple может прекратить поддержку этой платформы в качестве целевой платформы, как только выйдет 5.0, как они сделали для 2.x, когда вышла 4.0.
Брэд Ларсон

5
@Brad Установочная база для iOS4 уже превышает 95%. Я думаю, что в любом случае можно отказаться от поддержки iOS3.
Хенрик П. Хессель

2
Вы не удаляете dealloc, вы просто удаляете все свои releaseи [super dealloc]из него. А в 99,9% deallocпросто высвобождает объекты, поэтому вы их удаляете. Но объектам по-прежнему приходится выполнять другие задачи по очистке, которые не выполняются release(закрытие файлов, удаление наблюдателей и т. Д.).
Станислав Ягло

8

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

Если вы хотите отключить ARC для НЕСКОЛЬКИХ файлов:

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

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


7

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


Последняя бета-версия на самом деле побуждает меня удалить все вызовы распределения, и это все. Вы все еще можете сохранить / освободить, но система имеет последнее слово.
Дилан Гэтти

5

По этой части вашего вопроса

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

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


2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.