1

我有一个 iphone 应用程序需要为 iPhone 3.1.3 和 iPad 3.2 工作。这是我想在 iPad 上工作的 iPhone 应用程序。

主要区别在于 MPMoviePlayerController 在 3.2 中引入/弃用了很多东西。

由于 iPhone 操作系统只升级到 3.1.3 而 iPad 是 3.2,所以我需要分离我的代码,以便它只编译相应操作系统所需的代码。

我不能使用 [[UIDevice currentDevice] model] 因为我最终在 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

谢谢

4

3 回答 3

3

严格来说,#ifdef将查看是否__IPHONE_3_2已被赋予任何值,同时#if __IPHONE_3_2将检查特定值。

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

(仅供参考,__IPHONE_3_2如果您好奇,则定义为值 30200。)

于 2010-04-23T14:39:16.470 回答
3

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

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

看看这个:为 iPhone OS 介绍通用应用程序

于 2010-04-23T14:42:02.237 回答
0

测试 __IPHONE_3_2 是在 3.1 上编译具有 3.2 个符号的代码的唯一方法,您完全忽略了建议 NSClassFromString()/respondsToSelector:/UIInterfaceIdiom() 的要点,例如,这些不能用于标头定义,也不能解决链接错误,它们是完全不同问题的解决方案。

于 2010-04-26T07:49:40.713 回答