1

我正在使用MKReverseGeocoderiOS < 5 和CLGeocoderiOS >= 5,但由于MKReverseGeocoder已弃用而收到警告,然后我尝试执行以下操作:

#define SYSTEM_LOWER_THAN_5 ([[[UIDevice currentDevice] systemVersion] compare:@"5.0" options:NSNumericSearch] == NSOrderedAscending)

#if SYSTEM_LOWER_THAN_5
@interface TelstraLocationService () <MKReverseGeocoderDelegate>
#else
@interface TelstraLocationService ()
#endif

但我得到一个错误:

预处理器表达式开头的标记无效

这是由只能在运行时评估的宏引起的。有没有办法摆脱警告(不改变部署目标)?

4

1 回答 1

4

如果您的目标是简单地摆脱编译器警告(因为您已经考虑了任何潜在问题并明确决定忽略它),请使用以下编译器指令围绕触发代码:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    // some code that uses something deprecated
#pragma clang diagnostic pop

您希望尽可能具体,以避免无意中忽略其他有效的弃用警告。如果您在它之前和之后有另一个协议,则围绕它,否则只需MKReverseGeocoderDelegate围绕整个 @interface 块:

// option 1
@interface TelstraLocationService () <
    SomeProtocol

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
          MKReverseGeocoderDelegate
    #pragma clang diagnostic pop

    AnotherProtocol>

// option 2
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

@interface TelstraLocationService () <MKReverseGeocoderDelegate>

#pragma clang diagnostic pop

将任何对相同编译器指令的调用reverseGeocoder:didFindPlacemark:reverseGeocoder:didFailWithError:使用相同的编译器指令都包围起来,以使它们的弃用警告也消失。

于 2013-04-16T02:11:05.720 回答