标头在 Objective-C 中是如何工作的?

Posted

技术标签:

【中文标题】标头在 Objective-C 中是如何工作的?【英文标题】:How do headers work in Objective-C? 【发布时间】:2013-04-27 22:26:09 【问题描述】:

除了允许一个文件使用另一个文件的属性之外,幕后实际发生了什么?它只是在以后需要其内容时提供访问该文件的位置,还是将实现的数据加载到内存中?

【问题讨论】:

【参考方案1】:

总之;

头文件定义了模块的 API。这是一份合同,列出了第三方可以调用的方法。该模块可以被视为第三方的黑匣子。

实现实现了模块。它是黑匣子的内部。作为模块的开发人员,您必须编写此代码,但作为第三方模块的用户,您不需要了解有关实现的任何信息。标题应包含您需要的所有信息。

头文件的某些部分可以自动生成 - 方法声明。这将需要您对实现进行注释,因为实现中可能存在私有方法,它们不构成 API 的一部分,也不属于标头。

头文件有时包含其他信息;类型定义,常量定义等。这些属于头文件,而不是实现。 头文件的主要原因是能够#include 它在其他文件中,因此您可以在另一个文件的一个文件中使用函数。标头包含(仅)足以能够使用函数,而不是函数本身,因此(我们希望)编译它的速度要快得多。

独立维护这两个结果是因为没有人编写过能够很好地自动化该过程的编辑器。他们不能这样做的原因并不多,甚至有一些人甚至尝试过——但这样做的编辑在市场上从来没有做得很好,更主流的编辑也没有采用它。

好吧,我会尝试: 只有在预处理阶段才需要头文件。一旦预处理器完成了它们,编译器甚至不会看到它们。显然,目标系统也不需要它们来执行(同样不需要 .c 文件)。

相反,库是在链接阶段执行的。如果一个程序是动态链接的,并且目标环境没有必要的库,在正确的位置,具有正确的版本,它将无法运行。 在 C 中,不需要这样的东西,因为一旦你编译它,你就会得到本机代码。当你#include它时,头文件被复制粘贴。它与您从 java 获得的字节码非常不同。不需要解释器(如 JVM):您只需将二进制文件提供给 CPU,它就会完成它的工作。

【讨论】:

希望得到编译器级别的解释,但这是对标头的精彩概述。 我再编辑几行,你有这个链接:en.wikipedia.org/wiki/C_preprocessor我很抱歉我没有更多的深度。 额外的一点很有启发性。我认为我的好奇心正在引导我进行链接。

以上是关于标头在 Objective-C 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码在objective-c中是啥意思?

If-None-Match标头未接受请求标头

将 Swift 导入 Objective-C:未创建 Objective-C 标头“-Swift.h”

将 Swift 导入 Objective-C:未创建 Objective-C 标头“-Swift.h”

归档应用程序时找不到 Swift Objective-C 标头

双问号,它是如何工作的?