Отключить автоматический подсчет ссылок для некоторых файлов

183

Я скачал iOS 5 SDK и обнаружил, что ARC - отличная особенность нового компилятора Apple. В настоящее время многие сторонние платформы не поддерживают ARC. Могу ли я использовать ARC для моего нового кода и оставить текущий код сохранения / выпуска без изменений? Конвертер ARC здесь не работает, потому что некоторые фреймворки, такие как JSONKit, не могут быть конвертированы в ARC с помощью конвертера.

Редактировать:

Ответ состоит в том, чтобы добавить -fno-objc-arcк компилятору флаги для файлов, которые вы не хотите ARC. В Xcode 4 вы можете сделать это под вашей целью -> Build Phases -> Compile Sources.

nonamelive
источник
2
Чтобы уточнить, вы просто добавляете его в .mфайл. Не .hфайл.
ma11hew28
Я нашел этот разговор: github.com/gowalla/AFNetworking/issues/36 Может быть, это поможет кому-то, как интегрировать JSONKit в поддерживаемый проект iOS5 ARC ;-) Но я не пробовал в данный момент ...
Этот метод работал для меня. Я добавил AsyncUdpSocket для UDP Multicast в свой проект, и эти файлы [по крайней мере, текущей версии] НЕ поддерживают ARC. Поэтому я использовал описанный выше метод, чтобы добавить флаг компилятора в файл AsyncUdpSocket.m, и я смогу заставить код нормально работать с моим приложением.
Ашу Джоши
2
Это работает отлично! Особенности: перейдите к своей цели и выберите этапы сборки, затем скомпилируйте источники. Если дважды щелкнуть нужный файл .m, появится окно, в котором вы можете ввести / вставить: "-fno-objc-arc"
mpemburn

Ответы:

73

Публичные документы ARC , хотя и не совсем понятные по этому вопросу, по-видимому, предполагают, что, если каждый класс является либо ARC, либо полностью управляемым вручную, классы могут быть интегрированы в одну программу.

Вы не можете смешивать только ARC и не-ARC в одном классе; в документе говорится , что посылка retain, release, autorelease, или retainCountсообщения , с помощью любых средств (включая таймеры и отсроченные преформы, использование которых @selector) запрещены в АРК код. Таким образом, вы не можете делать не-ARC в классе ARC (потому что необходимые сообщения запрещены), и вы не можете делать ARC в не-ARC-классе (потому что ARC добавляет синтаксические элементы, которые недопустимы без ARC).

В том же документе немного яснее о том, можете ли вы интегрировать не-ARC библиотеки / фреймворки в программу ARC: Да. Здесь не упоминается, можете ли вы использовать библиотеки / фреймворки ARC в программе, где весь ваш код не является ARC, но, учитывая все вышеперечисленное, подразумевается, что да.

Питер Хоси
источник
Спасибо! Я выяснил, как отключить ARC для существующих классов, отличных от ARC.
nonamelive
Не могли бы вы поделиться с нами тем, что вы делаете?
Дэвид Х
1
@ Дэвид Х: Если вы намеревались обратиться с вопросом к спрашивающему, вы должны отметить, что спрашивающий изменил свое решение в вопросе.
Питер Хоси
Компиляция ARC не может быть отключена в файлах HEADER. Clang НЕ будет компилировать интерфейс / заголовок на основе компиляции его файла реализации / метода. Следовательно, файлы заголовков должны быть совместимы как с ARC, так и без ARC в смешанной компиляции. Я рассматриваю это как ошибку в компиляторе.
Кармин
1
@carmin: это не так. Компилятор не смотрит на заголовочные файлы, за исключением случаев, когда вы указываете это, что вы обычно делаете только#import извлечения их из файлов модулей. Настройка флагов компилятора для каждого файла модуля (точнее, каждого файла на этапе сборки «Исходники компиляции»). Компилятор не может узнать, должен ли он использовать ARC или нет для любого другого файла, кроме как путем наследования выбора, который ему был дан для файла модуля, с которого он был запущен.
Питер Хоси
78

Не очень интуитивно понятно, как отключить ARC для НЕСКОЛЬКИХ файлов, какое-то время я делал это один за другим, пока не понял, как это сделать.

  1. Выберите нужные файлы в Target / Build Phases / Compile Sources в Xcode (CMD + клик или Shift + клик)
  2. НАЖМИТЕ ВВОД (двойной щелчок сбросит выбор, поэтому он не работает)
  3. Тип -fno-objc-arc
  4. Нажмите Enter или Готово
Тибидабо
источник
1
Это не совсем ответ на вопрос, заданный здесь, но в любом случае чертовски хороший совет! Голосовал +1
Кристоф Ван Ландсхут
Вы правы, это не так, но я всегда просто гуглил по переключателю, и этот ответ один из самых популярных. Я думал, что в наши дни большинство людей уже знают ответ, но не этот «совет»
Тибидабо
35

Если вы хотите отключить автоматический подсчет ссылок для некоторых файлов, это действительно просто сделать, просто следуя инструкциям. Вы добавляете флаги компилятора в Targets -> Build Phases -> Compile Sources.

Xcode

Используемый флаг -fno-objc-arc нажмите enter после записи.! Вы должны дважды щелкнуть по правому столбцу строки под Флаги компилятора. Надеюсь, это поможет Спасибо :)

Нихил Бансал
источник
14
Вы можете использовать тот же метод, чтобы включить ARC для определенного файла в не-ARC проекте, используя флаг -fobjc-arc.
lnafziger
Компиляция ARC не может быть отключена в файлах HEADER. Clang НЕ будет компилировать интерфейс / заголовок на основе компиляции его файла реализации / метода. Следовательно, файлы заголовков должны быть совместимы как с ARC, так и без ARC в смешанной компиляции. Я рассматриваю это как ошибку в компиляторе.
Кармин