基于操作系统版本的条件方法
问题描述:
我确定这确实很简单,但我不确定如何搜索它,因为我已经看到了我认为称为编译器标志的例子,但总的来说是什么在支持它的操作系统版本上以可信方式运行特定方法的最佳方法。作为一个例子,NSDateFormatter类具有setDoesRelativeDateFormatting方法,该方法仅适用于10.6(在Mac上)和更高版本。基于操作系统版本的条件方法
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:enLocale];
[dateFormatter setDoesRelativeDateFormatting:YES];
答
对于这种特殊的情况下,它应该是很容易做到以下几点:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:enLocale];
if ([dateFormatter respondsToSelector:@selector(setDoesRelativeDateFormatting:)]) {
[dateFormatter setDoesRelativeDateFormatting:YES];
}
见NSObject
协议的-respondsToSelector:
获取更多信息。
答
这里有Adium的是如何检测到它是在Snow Leopard上或运行好做这样的东西(这是对的NSApplication一个类别):
//Make sure the version number defines exist; when compiling in 10.5, NSAppKitVersionNumber10_5 isn't defined
#ifndef NSAppKitVersionNumber10_5
#define NSAppKitVersionNumber10_5 949
#endif
- (BOOL)isOnSnowLeopardOrBetter
{
return (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5);
}
然后,所有你需要做的就是
if ([NSApp isOnSnowLeopardOrBetter]) { ... }
您可以通过命令单击NSAppKitVersionNumber以跳转到其定义来找到AppKit的版本号。
+0
谢谢,这也是一个很酷的想法。 – acidprime
如何防止编译引发基于SDK的警告? – acidprime