为什么objective-c@接口定义放在单独的.h文件中?

为什么objective-c@接口定义放在单独的.h文件中?,objective-c,Objective C,我承认这是一个一般性的问题,但我想听听你对以下问题的看法: 为什么@interface@protocol和@property定义被分离到一个.h头文件中,然后导入到实现文件中 有没有人只是定义了.m文件中的所有内容 顺便说一句,我并不是打算不使用.h文件,只是想了解它背后的想法 因为Objective-C依赖于标准的C基础结构,其中每个编译单元(.m)都是单独编译的,然后它们都链接在一起 这意味着Objective-C编译器的静态类型检查阶段只需要.h文件就可以知道声明类的特征(例如方法的签

我承认这是一个一般性的问题,但我想听听你对以下问题的看法:

  • 为什么@interface@protocol和@property定义被分离到一个.h头文件中,然后导入到实现文件中
有没有人只是定义了.m文件中的所有内容


顺便说一句,我并不是打算不使用.h文件,只是想了解它背后的想法

因为Objective-C依赖于标准的C基础结构,其中每个编译单元(
.m
)都是单独编译的,然后它们都链接在一起

这意味着Objective-C编译器的静态类型检查阶段只需要
.h
文件就可以知道声明类的特征(例如方法的签名),但只需要确保一切都按预期使用,这就是为什么要在其他源文件中导入它们,而这些源文件需要在头文件中声明的内容


如果您有使用A的
A.h/.m
B.h/.m
,您可以将头文件视为一个契约:“如果您想使用A,我将在编译阶段结束时链接其二进制代码,A能够提供的内容将在该头文件中描述,这是您应该知道的唯一事情。”

因为Objective-C依赖于标准的C基础结构,其中每个编译单元(
.m
)都是单独编译的,然后所有编译单元都链接在一起

这意味着Objective-C编译器的静态类型检查阶段只需要
.h
文件就可以知道声明类的特征(例如方法的签名),但只需要确保一切都按预期使用,这就是为什么要在其他源文件中导入它们,而这些源文件需要在头文件中声明的内容


如果你有使用A的
A.h/.m
B.h/.m
,你可以把头文件想象成一个合同:“如果你想使用A,我会在编译阶段结束时链接它的二进制代码,A能够提供的内容在这个头文件中描述,这是你唯一应该知道的”

谢谢@Jack,这有助于我理解编译过程。理论上,编译器可以从导入的文件中提取@interface定义吗?顺便说一句,我并不打算不使用.h文件,只是试图理解它背后的思想如果你是指a
.m
,那么理论上它可以,但是
\import
(通常
\include
)指令由预处理器管理,它用指定文件的内容替换该指令,它不会为您做任何脏活。这就是为什么需要拆分它们。您可以将它们视为前向声明:因为您的<代码> .M./COD>文件使用的东西不是直接在那里声明的,而是同时在另一个单元中编译的,所以您需要向代码解释在其他地方实现的类的特性。再次感谢杰克的详细解释!谢谢@Jack,这有助于我理解编译过程。理论上,编译器可以从导入的文件中提取@interface定义吗?顺便说一句,我并不打算不使用.h文件,只是试图理解它背后的思想如果你是指a
.m
,那么理论上它可以,但是
\import
(通常
\include
)指令由预处理器管理,它用指定文件的内容替换该指令,它不会为您做任何脏活。这就是为什么需要拆分它们。您可以将它们视为前向声明:因为您的<代码> .M./COD>文件使用的东西不是直接在那里声明的,而是同时在另一个单元中编译的,所以您需要向代码解释在其他地方实现的类的特性。再次感谢杰克的详细解释!谢谢。