Xcode / iOS - избавиться от предупреждений об устаревании для определенных констант? - PullRequest
7 голосов
/ 26 июня 2011

У меня есть некоторые устаревшие константы в моем проекте.Им нужно остаться.Я не хочу, чтобы о них предупреждали, но хочу, чтобы их предупредили, если в моем проекте появятся другие устаревшие константы.

Заголовок Apple объявляет их следующим образом:

extern NSString * const NameOfStringConstant __OSX_AVAILABLE_BUT_DEPRECATED(version availability info here)

Как я могу заставить замолчать предупреждение?

Связанный ответ для глушения предупреждения об устаревшем методе здесь
Связанный ответ для глушения предупреждения о преобразовании устаревшей строки здесь

Ответы [ 4 ]

24 голосов
/ 04 февраля 2013

Я знаю, что это старая тема, но сегодня я имел дело с тем же раздражением.

Пример: вы хотите избавиться от раздражающего предупреждения об устаревании, но только на [[UIDevice currentDevice] uniqueIdentifier]], так как вы, скорее всего, захотитеиспользовать его на этапе разработки с TestFlight.Вы все еще хотите, чтобы компилятор предупреждал вас, если вы по ошибке используете какое-то другое устаревшее объявление.

Мне нравится ответ sarfata : он выполняет свою работу.Но есть еще политкорректный доступный способ:

Следующий рецепт взят из Блог Goo Software .

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];
#pragma clang diagnostic pop

Обязательно комментируйтеэти строки перед сборкой для раздачи.Или просто используйте макрос препроцессора, чтобы исключить эти строки из сборки выпуска.

2 голосов
/ 21 декабря 2011

Добавьте к флагам компилятора:

-Wno-deprecated-declarations

или, в Xcode, выберите «Нет» для параметра настройки сборки:

Warn About Deprecated Functions

, а затем, если вы посмотрите на сборкувывод (Apple + 7 в Xcode 4), вы заметите вышеупомянутый флаг компилятора.

1 голос
/ 15 августа 2012

Это ответ № 1 в Google, и я полагаю, что есть несколько справедливых случаев, когда использование устаревшего метода полезно и когда вы хотите избежать предупреждений, чтобы сохранить сборку "чистой". Это решение вдохновлено: http://vgable.com/blog/2009/06/15/ignoring-just-one-deprecated-warning/

Идея состоит в том, чтобы объявить новый протокол, который имеет тот же метод (но, конечно, не устарел), и привести объект к этому протоколу. Таким образом, вы можете вызывать метод, не получая предупреждения и не избавляясь от всех предупреждений об устаревании.

Пример. Если вы хотите интегрировать TestFlight в свое приложение, в документации SDK предлагается передать uniqueIdentifier устройства, находясь в режиме бета-тестирования. Это может помочь отследить, у какого тестера были проблемы. Apple не рекомендует этот метод (и они не позволят вам отправить приложение), но я считаю, что это хороший пример использования устаревшего метода.

В вашем приложении Делегат:

/* This is to avoid a warning when calling uniqueIdentifier for TestFlight */
@protocol UIDeviceHack <NSObject>

- (NSString*) uniqueIdentifier;

@end


@implementation MyAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [TestFlight takeOff:@"Your-Testflight-team-id"];
    // TODO: Remove this in production (forbidden APIs) - Used here to improve beta reporting.
    [TestFlight setDeviceIdentifier:[(id<UIDeviceHack>)[UIDevice currentDevice] uniqueIdentifier]];

    // ...
}
1 голос
/ 26 июня 2011

Правильный ответ на этот вопрос - не использовать устаревшие константы. Проверьте документацию для рекомендуемого способа сделать что-то сейчас. На устаревших методах / константах / чем угодно, почти всегда есть ссылка на «замену», если хотите. Используйте это вместо этого. Таким образом, ваш код не таинственным образом ломается, когда они исчезают навсегда, но ваши пользователи все еще имеют сборку, созданную на основе старого SDK, и теперь их код вылетает, или, что еще хуже, делает странные вещи.

...