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


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.