【问题标题】:Xcode - preprocessor directive check which SDK is being usedXcode - 预处理器指令检查正在使用哪个 SDK
【发布时间】:2011-05-20 23:48:12
【问题描述】:

我正在对使用“addTimeInterval:”函数的现有库进行一些更改,该函数在 OS X v10.6 中已弃用。我想使用预处理器指令来抑制警告,以检查当前构建使用的 SDK 版本。像这样的:

NSDate *newDate= nil;

#if OS X v10.6 (or newer)
newDate= [someOtherDate dateByAddingTimeInterval:60];
#else
newDate= [someOtherDate addTimeInterval:60];
#endif

这完全可能使用 Xcode 4 吗?

【问题讨论】:

  • 如果您这样做,您将在构建时更改一次行为。如果该代码构建一次并在任何地方运行,它将调用旧平台上的 10.6 代码。

标签: cocoa xcode preprocessor


【解决方案1】:

+[NSDate dateWithTimeIntervalSinceNow:] 自 10.0 以来一直存在吗?


也许您可以进行运行时检查,而不是进行编译时检查:

if ([[NSDate class] instancesRespondToSelector:@selector(dateByAddingTimeInterval:)]) {
  newDate = [someOtherDate dateByAddingTimeInterval:60];
} else {
  newDate = [someOtherDate addTimeInterval:60];
}

【讨论】:

  • 这只是一个示例代码,我真的不需要为“现在”添加时间。理想情况下,该库适用于所有(或大多数)版本的 OS X 和 iOS。
【解决方案2】:
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
    newDate = [someOtherDate dateByAddingTimeInterval:60];
#else
    newDate = [someOtherDate addTimeInterval:60];
#endif

但如果您使用 10.6 SDK 构建它,它将不适用于 10.5。正如@Dave 所说,需要运行时检查。

【讨论】:

    【解决方案3】:

    您可以使用我在CLLocation getDistanceFrom: vs distanceFromLocation: 中描述的完全相同的技术

    只需在说明中将CLLocation 替换为NSDate,将getDistanceFrom: 替换为addTimeInterval:,将distanceFromLocation: 替换为dateByAddingTimeInterval:,无论您使用什么SDK,您都可以始终使用dateByAddingTimeInterval:无论您运行的是什么操作系统版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多