#ifdef __IPHONE_3.2和#if __IPHONE_3.2有什么区别?

时间:2010-04-23 14:33:30

标签: iphone ipad macros device xcode3.2

我有一款iphone应用,需要适用于iPhone 3.1.3和iPad 3.2。这是一款我想在iPad上运行的iPhone应用程序。

主要区别在于MPMoviePlayerController引入/并弃用了3.2中的大量内容。

由于iPhone OS仅上升到3.1.3且iPad上3.2,我需要分离我的代码,因此它只编译相应操作系统所需的代码。

我无法使用[[UIDevice currentDevice]模型]因为我最终在3.1.3代码上发布了已弃用的警告。此外,UIUserInterfaceIdiomPad是3.2中的新功能,因此它不适用于3.1.3 ...

所以,我决定使用它,它只编译特定操作系统所需的内容:

#if __IPHONE _3_2

//do 3.2 iPad stuff

#else

//do 3.1.3 iPhone/iPod Touch stuff

#endif

我的问题是......这些有什么区别?

#ifdef __IPHONE_3_2

#if __IPHONE_3_2

谢谢

3 个答案:

答案 0 :(得分:3)

严格来说,#ifdef会查看__IPHONE_3_2是否已获得任何值,而#if __IPHONE_3_2会检查特定值。

在这种情况下,我会使用#ifdef __IPHONE_3_2,因为您只需要检查该值是否存在。

(仅供参考,__IPHONE_3_2被定义为30200,以防您感到好奇。)

答案 1 :(得分:3)

您无法在编译时使用检查来检查与运行时相关的内容。您应该使用-respondsToSelector:UIInterfaceIdiom()宏。

确保链接3.2 SDK(这意味着将Base SDK设置为3.2)并将您的部署目标设置为您想要支持的最低iPhone OS版本(3.1.3)。

看看这个:Introducing Universal Applications for iPhone OS

答案 2 :(得分:0)

测试__IPHONE_3_2是编译具有3.2个符号的3.1上的代码的唯一方法,您缺少完全推荐NSClassFromString()/ respondsToSelector:/ UIInterfaceIdiom()的点,例如,不能在头定义中使用那些,也不是他们解决了链接错误,它们是解决完全不同问题的方法。