Подавление устаревших предупреждений в Xcode - PullRequest
128 голосов
/ 12 апреля 2010

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

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

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

Ответы [ 9 ]

324 голосов
/ 09 ноября 2010

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

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop
141 голосов
/ 15 ноября 2012

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

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

Процитирую инструкцию Clang :

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

76 голосов
/ 12 апреля 2010

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

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

enter image description here


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

enter image description here

39 голосов
/ 25 октября 2014

Поскольку нам, как правило, необходимо поддерживать старые ОС, но обращать внимание на наши предупреждения, я хотел найти более аккуратный способ сделать это. Я собрал это вместе, вдохновленный каким-то кодом 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;
);

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

29 голосов
/ 26 июля 2010

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

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

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

16 голосов
/ 20 апреля 2018

Если вы хотите отключить предупреждение Реализация устаревшего метода или Реализация устаревшего класса , используйте:


    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-implementations"
    // code
    #pragma clang diagnostic pop

8 голосов
/ 28 сентября 2016

В настройках вашей сборки найдите Deprecated Functions.

enter image description here

1 голос
/ 17 декабря 2018

Если вы хотите проверить все виды устаревших элементов кода. Пожалуйста, используйте флаг -Wdeprecated , как показано ниже:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop
0 голосов
/ 04 февраля 2014

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

#pragma clang system_header
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...