Вимкнути автоматичний підрахунок посилань для деяких файлів


183

Я завантажив iOS 5 SDK і виявив, що ARC є чудовою особливістю нового компілятора Apple. На сьогоднішній день багато сторонніх фреймворків не підтримують ARC. Чи можу я використовувати ARC для свого нового коду і зберегти незмінним поточний код збереження / випуску? Тут не працює перетворювач ARC, оскільки деякі рамки, такі як JSONKit, не можуть бути перетворені в ARC за допомогою перетворювача.

Редагувати:

Відповідь - додати -fno-objc-arcдо компілятора прапори для файлів, які не потрібні ARC. У Xcode 4 ви можете це зробити під своєю ціллю -> Фази збірки -> Компілювати джерела.



2
Для уточнення, ви просто додаєте його у .mфайл. Не .hфайл.
ma11hew28

Я знайшов цю розмову: github.com/gowalla/AFNetworking/isissue/36 Можливо, це допоможе комусь, як інтегрувати JSONKit у проект, що підтримується ARC iOS5 ;-) Але я наразі не спробував цього ...

Цей метод спрацював для мене. Я додав у свій проект AsyncUdpSocket для UDP Multicast, і ці файли [принаймні поточної версії] НЕ підтримують ARC. Тому я використав метод вище, щоб додати прапор компілятора до файлу AsyncUdpSocket.m, і я можу змусити код добре працювати зі своїм додатком.
Ашу Джоші

2
Це прекрасно працює! Особливості: Перейдіть до своєї цілі та оберіть Фази збірки, а потім Компілюйте джерела. Якщо ви двічі клацніть відповідний файл .m, він з’явиться у вікні, де ви можете ввести / вставити: "-fno-objc-arc"
mpemburn

Відповіді:


73

Загальнодоступні документи ARC , хоча це не чітко зрозуміло з цього приводу, здається, дозволяють припустити, що поки кожен клас або весь ARC, або всі керовані вручну, класи можуть бути інтегровані в одну програму.

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

Цей самий документ дещо зрозуміліше, чи можна інтегрувати не-ARC бібліотеки / рамки в програму ARC: Так. Тут не згадується, чи можна використовувати бібліотеки / рамки ARC в програмі, де весь ваш код не є ARC, але, враховуючи все вищезазначене, наслідки, здається, є так.


Дякую! Я придумав, як відключити ARC для існуючих класів, які не є ARC.
nonamelive

Чи можете ви поділитися з нами тим, що ви робите?
Девід Н

1
@David H: Якщо ви мали намір звернутися з цим до запитувача, то слід зазначити, що запитувач змінив своє рішення у питанні.
Пітер Хосей

Компіляцію ARC неможливо відключити у файлах HEADER. Clang НЕ компілюватиме інтерфейс / заголовок на основі компіляції файлу реалізації / методу. Тому файли заголовків повинні бути сумісні як з ARC, так і з не ARC у змішаній компіляції. Я розглядаю це як помилку в компіляторі.
Кармін

1
@carmin: Це не так. Компілятор не розглядає файли заголовків, за винятком випадків, коли ви їх повідомляєте, що зазвичай ви робите, лише #importвиконуючи їх з файлів модулів. Установка прапорів компілятора призначена для кожного файлу модуля (точніше, кожного файлу у фазі збірки "Джерела компіляції"). У компілятора немає способу знати, чи повинен він використовувати ARC чи ні для будь-якого іншого файлу, за винятком наслідування вибору, який він був наданий для файлу модуля, з якого він починався.
Пітер Хосей

78

Не дуже інтуїтивно зрозуміти, як відключити ARC на МНОГО файлах, якийсь час я робив це по черзі, поки не з'ясував, як це зробити.

  1. Виберіть потрібні файли за допомогою цільових / збірних фаз / компілювати джерела у коді Xcode (CMD + клацання або Shift + клацання)
  2. ПРЕСС ВВЕДЕННЯ (подвійним клацанням буде скинутий вибір, тому він не працює)
  3. Тип -fno-objc-дуга
  4. Натисніть Enter або Готово

1
Це насправді не відповідь на поставлене тут запитання, але криваво добрий підказ все одно! Проголосували +1
Крістоф Ван Ландшот

Ви маєте рацію, це не так, але я завжди просто гуляв за вимикач, і ця відповідь є одним із найкращих хітів. Я подумав, що в наші дні більшість людей вже знає відповідь, але не ця "порада"
Тібідабо

35

Якщо ви хочете відключити автоматичний підрахунок посилань для деяких файлів, це зробити дійсно просто, просто дотримуйтесь вказівок. Додайте прапорці компілятора в цілі -> Фази збірки -> Компілювати джерела.

xcode

Використовуваний прапор - після його написання натисніть кнопку -fno-objc-arc .! Вам потрібно двічі клацнути правою колонкою рядка під Прапорами компілятора. Сподіваюся, це допомагає Спасибі :)


14
Ви можете використовувати той самий метод, щоб увімкнути ARC для певного файлу в проекті, який не є ARC, використовуючи прапор -fobjc-arc.
lnafziger

Компіляцію ARC неможливо відключити у файлах HEADER. Clang НЕ компілюватиме інтерфейс / заголовок на основі компіляції файлу реалізації / методу. Тому файли заголовків повинні бути сумісні як з ARC, так і з не ARC у змішаній компіляції. Я розглядаю це як помилку в компіляторі.
Кармін

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.