使用Xcode开发iPhone APP的时候, 为了保证代码的向下兼容, 有时候可能需要用到条件编译。 譬如有些代码只在4.0及以后版本中可用, 如MFMessageComposeViewController
#define __IPHONE_2_0 20000
#define __IPHONE_2_1 20100
#define __IPHONE_2_2 20200
#define __IPHONE_3_0 30000
#define __IPHONE_3_1 30100
#define __IPHONE_3_2 30200
#define __IPHONE_4_0 40000
#define __IPHONE_NA 99999 /* not available */
上面的代码预定义在iPhone SDK 4中,当我们查看SDK3。x版本的定义时,发现其中没有定义__IPHONE_4_0, 故我们可以通过判断是否定义__IPHONE_4_0来确定是否为4。x的版本。
#ifdef __IPHONE_4_0
#import ...
#endif
3 |
编译App的时候,可以指定App所使用的SDK,这样可以让App在多个OS版本上运行。比如: 1> 向上兼容(forward-compatibility):为某一OS做优化,同时还可以在以后的更高的OS版本上运行。 2> 向下兼容(backward-compatibility):让App在老的OS版本上也能运行。 为实现此功能,需要指定各个OS的头文件和相应的库(headers and libs),还要指定最小版本。这些由Xcode设置里的Base SDK和Deployment OS version决定。 Deployment OS version决定了你可以无条件使用的所有函数和系统调用;Base SDK决定了你可以挑选的一些功能。 如果你想在App中使用连Base SDK都不支持的函数,那会产生一个编译错误。 如果你使用了在文档中标明了在Base SDK中是deprecated的函数,那会产生一个编译警告。 如果你使用了Base SDK里的可选函数,然后编译出App。可是安装到低SDK版本的iPhone上,该函数只是一个空指针。
随着frameworks逐代演化,很多API引入,同时很多API被废弃,现存的API也会有变化。苹果为了消除API的不兼容,会提供备选项。在这种时候,程序员需要根据framework版本的不同使用不同的API。苹果的framework也会自动检测用户iPhone上的SDK版本,然后做相应调整。(前提是framework可以发现这些不兼容)
这些不兼容的API都会在framework release notes里标明。所以,release note是相当重要的东西。
如果想知道如何根据不同的SDK进行条件编译,如何在程序运行时判断SDK,如何查找deprecated函数,请参照: http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW6
下面是两种常用的方法,简单有效。 条件编译: #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2 // iPhone 3.0 code here #endif
动态区分: float version = [[[UIDevice currentDevice] systemVersion] floatValue]; if (version >= 3.0) { // iPhone 3.0 code here }
|
|