2012-05-22 2 views
2

Это может быть глупый вопрос, но я просто хотел узнать. Я хочу, чтобы мой код обнаружил, включен ли ARC программно. Как мне это сделать? Есть ли какой-нибудь флаг, который я мог бы проверить? На самом деле проблема в том, что я написал библиотеку с открытым исходным кодом. Я использовал release и retain. если кто-то другой использует файлы моей библиотеки с использованием ARC, я не хочу, чтобы они получали какие-либо ошибки. как мне это достичь? или есть ли какие-либо возможные способы предоставить какие-либо инструменты для компиляции моей библиотеки перед ее использованием?Как программно определить автоматический подсчет ссылок?

+0

Xcode и ARC не позволят вам использовать функцию сохранения og и давать вам ошибки. – Martol1ni

+0

@DhilipSiva Пожалуйста, убедитесь, что вы проверяете все грамматические ошибки, выравнивание перед публикацией вопроса. Перед публикацией прочитайте http://stackoverflow.com/faq#etiquette. – Beginner

ответ

18
#if !__has_feature(objc_arc) 
    //Do manual memory management... 
#else 
    //Usually do nothing... 
#endif 

Это, конечно, проверка времени компиляции, вы не можете проверить АРК во время выполнения.

Альтернативой было бы установить флаг компилятора -fno-objc-arc для ваших файлов, которые используют ручное управление памятью в проекте, который в противном случае использует ARC.

Независимо от того, хотите ли вы вообще этого или просто использовать ARC, зависит от того, насколько вы хотите/должны быть обратно совместимы. Код, который поддерживает как ARC, так и MRC, может быть довольно трудно читать и поддерживать.

2

Вы не определяете его программно, оно действует на основе переводов. То есть, не, как Garbage Collection - это процесс, требующий поддержки всех связанных библиотек (и правильной реализации в этом режиме). У вас могут быть файлы, скомпилированные с помощью ARC, а некоторые - без.

Однако, вы можете detect it at compilation.

Что касается распределения вашей библиотеки: я бы не стал беспокоиться о системе на основе перевода, где ref ref ops условно разрешен. Я бы лично поддержал одну модель (MRC в вашем случае, пока вы не решите ее перенести в ARC), а затем ожидайте, что люди свяжутся с библиотекой или компилируют ее в целевой настройке, чтобы отключить ARC. Условное включение/отключение кода, основанного на наличии функции, требует жестких ошибок, особенно когда это может повлиять на 9% строк кода вашей библиотеки.

+0

Согласовано. Люди могут либо отключить ARC для исходных файлов, либо просто распространять файлы .a, которые будут работать нормально. Я думаю, вы все равно можете использовать #error во время компиляции, чтобы предупредить пользователя, которому они должны отключить ARC для ваших исходных файлов. –

+0

@MikeWeller Это также легко распространять как xcodeproj с источниками (когда это вариант). Явная '# ошибка' на высоком уровне' # include' является приятным прикосновением, но в этом случае эта проблема проявится достаточно скоро (потому что это MRC). Если это необходимо * ARC OTOH, следует считаться требованием высокого уровня '# error' (в случае, если предупреждения статического анализатора были недостаточны для намека или клиент никогда не использовал его). – justin

1

НЕТ, вы не можете, Xcode бы не скомпилировать в ARC проектов, если ваш источник использует сохраняют-релиз

Смежные вопросы