为什么Objective-C使用头文件而不是像Java这样的单文件类?

时间:2011-08-10 21:55:55

标签: java objective-c header-files

我主要使用Java,最近我正在尝试学习用于Mac和iOS应用程序开发的Objective-C。现在,这种语言与我习惯的,指针,消息等完全不同,但我似乎正在接受它。这不是一个编码问题,但我宁愿熟悉我正在处理的事情,而不仅仅是知道“它必须是这样的,因为它就是这样”。

为什么Objective-C语言需要头文件?它们与.m文件分开的实际目的是什么?为什么函数需要在头文件中声明而不是刚刚实现?它只是其中一个没有从旧语言中消失的东西,还是与Java的单文件类相比有真正的优势?

3 个答案:

答案 0 :(得分:14)

由于C的向下兼容性,主要存在.h文件 - 所有C代码也是有效的Objective-C代码。 C编译器一次只能处理一个文件;每个文件都是独立编译和解析的。 C编译器“必须”在首次使用之前已经看到了某个符号的声明。所以,如果你在B.m中使用A类,那么编译器必须在某个时候看到A的声明;为了避免像#include "A.m"这样的事情,惯例是在头文件中拆分声明并在.c,.m,.cpp ...文件中实现。

其他语言(如Java)会在编译时自动扫描B.java的同一目录中的文件,以查找其他类的声明; C编译器有点“老”,需要你#include所有必要的标题。

简而言之:主要是历史原因。

答案 1 :(得分:7)

The Wikipedia entry on header files使用与您相同的Java比较,这是一个奖励:

  

一些编程语言(最着名的是C,C ++和Objective-C)使用   头文件。这些文件允许程序员将某些文件分开   程序源代码的元素到可重用文件中。头文件   通常包含类,子例程的前向声明,   变量和其他标识符。希望申报的程序员   多个源文件中的标准化标识符可以放置   单个头文件中的标识符,然后其他代码可以包含   每当需要标题内容时。这是为了保持   标头中的接口与实现分开。 C   标准库和C ++标准库传统上声明它们的   头文件中的标准函数。

     

较新的编译语言(如Java,C#)不使用forward   声明;标识符从源自动识别   文件并直接从动态库符号中读取。这意味着   

。不需要头文件

答案 2 :(得分:5)

您不必拥有头文件。你可以在同一个文件中使用你的接口和实现,但是更容易将它们分开,也使得导入类更整洁,这意味着其他类不会从.m继承它们不需要的东西(就像常量一样) )。