Подавление устаревших предупреждений в Xcode

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

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

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

Ответ 1

Попробуйте -Wno-deprecated-declarations или его соответствующую настройку в Xcode, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS:

enter image description here

Ответ 2

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

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

Ответ 3

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 также позволяет вам нажимать и вызывать текущее состояние предупреждения. Это особенно полезно при написании файла заголовка, который будет скомпилирован другими людьми, потому что вы не знаете, какие предупреждающие флаги они строят с помощью.

Ответ 4

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

Ответ 5

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

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

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

Ответ 6

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

введите описание изображения здесь

Ответ 7

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

#pragma clang system_header