Objective-C中的#statements

时间:2011-04-27 22:18:34

标签: objective-c

我遇到了以下代码,我想知道#statement意味着什么,以及是否有任何好的地方可以学习如何使用语法:

 #if __IPHONE_3_0
  cell.textLabel.text = [photoTitles objectAtIndex:indexPath.row];
  cell.textLabel.font = [UIFont systemFontOfSize:13.0];
#else
  cell.text = [photoTitles objectAtIndex:indexPath.row];
  cell.font = [UIFont systemFontOfSize:13.0];
#endif

3 个答案:

答案 0 :(得分:4)

这不是Objective-C,它是“C预处理器”,它基本上是一个专门的文本解析系统,它在项目实际编译之前在项目的每个源文件上运行。它与处理#import指令的系统相同。

将其视为为您的代码提供“元”编译。在这种情况下,iPhone 3.0有一个编译环境变量。如果存在该变量,则编译前两行代码。如果没有,那么后两个会这样做。

此处有更多信息:http://en.wikipedia.org/wiki/C_preprocessor

答案 1 :(得分:2)

这些是C预处理程序指令。它们允许您在编译源代码之前根据编译器选项更改程序的源代码。

在您的示例中,如果代码正在为 iOS 3.0(或更高版本)编译,则会编译第一个代码块(#if#else之间)。否则,使用第二个代码块。

请注意,这发生在编译时间,而不是运行时间。因此,上述技术对于在多个项目中使用的代码更有用。

如果您搜索“预处理程序指令”的信息,您应该找到更多信息。

答案 2 :(得分:1)

这些是编译器指令,特别是条件。它们会导致代码的编译方式不同,具体取决于编译时的环境。

有关条件和其他编译器指令的更多信息,请查看this page on conditionals in the C Preprocessor,它对C和Objective-C的工作方式类似。

请记住,这些只在编译时发挥作用。如果您在其iPhone 3.0配置中编译此代码,程序将无法在运行时检测到您在iPhone 4上运行它。您将不得不重新配置源代码,以便未定义__IPHONE_3_0,并且然后再次编译程序。