2010-04-12 3 views
117

Со всеми всплывающими SDK, это удобно для создания нескольких SDK и платформ. Тем не менее, отражаясь от 3,2 до 3,0 и даже иногда 2.x, я часто получаю устаревшие предупреждения, связанные с методами, которые были изменены или были заменены:Подавление устаревших предупреждений в Xcode

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated. 

Поскольку я все еще хочу, чтобы сохранить совместимость с более старыми операционными системами, и я также стремясь удалить «шум» при построении, есть ли способ отключить или отключить эти предупреждения?

+3

Хотя ответ Пол R работает, считает, что manicaesar является немного более хирургическим, в том, что она позволяет подавить именно предупреждение вы хотите, не теряя при этом других дополнительных предупреждениях, которые могут быть важно. Мне кажется, что с точки зрения передового опыта у manicaesar есть правильный ответ ™ – Olie

ответ

67

Попробуйте -Wno-deprecated-declarations или его соответствующую настройку в Xcode, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS (pro tip: просто введите «устаревшие» в настройках сборки, чтобы найти конкретные настройки для этого предупреждения).

Текущие версии Xcode (например Xcode 9.2):

enter image description here


древние версии Xcode (например Xcode 2.x, 3.x):

enter image description here

+17

Оказывается, это еще проще, чем это; есть флажок в целевых настройках Xcode; ваш ответ заставил меня искать там. Благодаря! –

+2

Вы также можете сделать это для каждого файла. См. Этот ответ для добавления флагов для каждого файла: http://stackoverflow.com/a/6658549/272473 – mrwalker

+4

Ответы, подобные этому, расстраивают для newbs. Попробуйте, где? Как найти целевые настройки? Немного больше объяснений повысит ценность этого ответа. – noogrub

25

Вы также можете подавлять предупреждения в файле с помощью

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 

, который, в свою очередь, делает его немного лучше, чем просто подавлять все предупреждения один раз и вместе ... ведь вы все узнали, для чего вы это делаете.

+0

Упрощенный ... работал как шарм – NSPratik

300

Поскольку я еще не могу добавить комментарий к сообщению @samiq, я думаю, что я его расширю. Вводите указанную директиву перед функцией/методом, в которой вы используете устаревшие вещи. Затем вы можете восстановить предыдущие настройки после определения функции конца:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma GCC diagnostic pop 
+1

Отлично! Это то, что я искал +1 :) –

+1

Удивительный совет! Слишком плохо, что он не может быть объявлен внутри метода. – Dustin

+12

На самом деле он может быть объявлен внутри метода. Я просто должен был сделать это сегодня из-за ошибки в документации/SDK – jer

131

Clang обеспечивает хорошую особенность, которая делает «восстановить» шаг в @manicaesar пост независимо от начального состояния предупреждения:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma clang diagnostic pop 

цитирую Clang manual:

в дополнение ко всем функциональным возможностям, обеспечиваемым прагме GCC, в Clang также позволяет толкать и поп текущее предупреждение государство. Это особенно полезно при написании файла заголовка, который будет скомпилирован другими людьми, потому что вы не знаете, с каким флагом предупреждения они строят.

+1

В последних версиях GCC используется тот же синтаксис (заменитель clang для GCC). – Niclas

+2

Я всегда смущаюсь о том, что такое LLVM, GCC и Clang. Поэтому я хотел отбросить записку, чтобы сэкономить время. Коллекция GNU Complier Collection (GCC) использовалась с Xcode 3, затем Apple выпустила Xcode 4 с гибридным LLVM-GCC. Затем компилятор Low Level Virtual Machine (LLVM) занял место, см. Дополнительную информацию на http://llvm.org. Начиная с Xcode 7.2.1 по умолчанию компилятор Apple LLVM 7.0. Компилятор LLVM - это библиотека других «проектов», отладчиков и других инструментов, которые включают в себя собственный компилятор Clang. Clang - это «LLVM native» C/C++/Objective-C компилятор. –

-2

Чтобы отключить предупреждение из файла заголовка третьей стороной, добавьте следующую строку в верхней части файла

#pragma clang system_header 
36

Поскольку мы, как правило, должны поддерживать старую операционку, но обратите внимание на наши предупреждения, я хотел более аккуратный способ сделать это.Я положил это вместе, вдохновленный некоторый Mozilla код:

#define SILENCE_DEPRECATION(expr)         \ 
do {                \ 
_Pragma("clang diagnostic push")         \ 
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ 
expr;                \ 
_Pragma("clang diagnostic pop")          \ 
} while(0) 

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 

Это позволяет сделать следующее:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]); 

Он также работает с блоками кода:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self]; 
    view.lineWidth = self.lineWidth; 
    view.strokeColor = self.color; 
); 

Кроме того, когда вы отказываетесь от поддержки устройств pre-iOS 7, вы можете легко найти код, чтобы найти устаревшие способы исправления.

+0

это гораздо лучшее долгосрочное решение для большинства кодов, чем ограничение на предупреждения (или любые другие) на глобальном уровне/уровне проекта. потрясающий ответ. – natbro

+0

Это очень сексуальный способ решить эту общую проблему. Я ценю ваши усилия. –

+0

Как ссылка, это может использоваться для любой опции clang ...Я лично использую его для этого ('-Wdeprecated-declarations') и для отключения функции предупреждения утечки функцииSelector (' -WperformSelector-leak '). Вам просто нужно изменить параметр во втором вызове '_Pragma' соответственно. –

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