您将使用__IPHONE_OS_VERSION_MAX_ALLOWED支票的情况如何? __IPHONE_OS_VERSION_MIN_required怎么办?
解决方法
重要的是要了解这些是编译时常量,因此它们在运行时检测您正在运行的平台或操作系统版本(例如检测您是否在iPad和iPhone上运行)无用.
这些常量的作用是允许您在编译时检测是否为给定的SDK或部署目标构建了代码.例如,如果您编写的开源库包含的代码仅适用于针对iOS 5 SDK编译的代码,则可能需要使用此检查来检测要编译代码的SDK:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000 //you can use iOS 5 APIs here because the SDK supports them //but the code may still crash if run on an iOS 4 device #else //this code can't use iOS 5 APIs as the SDK version doesn't support them #endif
或者,如果您想查看目标的最低操作系统版本是…
#if __IPHONE_OS_VERSION_MIN_required >= 50000 //minimum deployment target is 5.0,so it's safe to use iOS 5-only code #else //you can use iOS5 APIs,but the code will need to be backwards //compatible or it will crash when run on an iOS 4 device #endif
这不同于在运行时检测您正在运行的操作系统.如果您使用iOS 4 SDK在上述第一个示例中编译代码,那么它将使用您的iOS 4安全代码,但在iOS 5设备上运行时不会利用任何iOS 5功能.如果您使用iOS 5 SDK构建它,则将部署目标设置为iOS 4,并尝试在iOS 4设备上运行,它将编译并安装正常,但仍可能在运行时崩溃,因为iOS 5 API不存在.
在上面的第二个示例中,如果您将部署目标设置为iOS 4或更低版本,那么它将使用iOS 4安全的代码路径,但如果将部署目标设置为iOS 5,则它将不会在iOS上运行4设备(将拒绝安装).
要构建一个在iOS 4和5上运行的应用程序,如果可以使用iOS 5功能,您仍然需要执行运行时检测.要在运行时检测iOS版本,可以这样做:
if ([[[UIDevice currentDevice] systemVersion] compare:@"5.0.1" options:NSNumericSearch] != NSOrderedAscending) { //running on iOS 5.0.1 or higher }
但这意味着跟踪哪些API功能被添加到哪个操作系统版本,这是笨重的,只能作为最后的手段.通常,更好的方法是使用特征检测,如下所示:
if ([SomeClass class]) { //this class exists } if ([SomeClass instancesRespondToSelector:@selector(someMethod:)]) { //this method exists }
另外,要在运行时检测是否在iPad或iPhone上,可以这样做:
if (UI_USER_INTERFACE_IdioM() == UIUserInterfaceIdiomPad) { //on an ipad }
在运行时执行这些检查,您可以创建在多个设备和iOS版本上运行的单个应用程序,并且可以利用每个平台的功能.