我有一款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
谢谢
答案 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)。
答案 2 :(得分:0)
测试__IPHONE_3_2是编译具有3.2个符号的3.1上的代码的唯一方法,您缺少完全推荐NSClassFromString()/ respondsToSelector:/ UIInterfaceIdiom()的点,例如,不能在头定义中使用那些,也不是他们解决了链接错误,它们是解决完全不同问题的方法。