我不明白为什么有一个单独的头文件 .h 用于实例声明和变量声明,然后在类文件 .m 中编写我的类。
为什么不像解释语言那样呢?只需声明一个函数并在需要时引用它。对我来说似乎有很多重复的代码,我希望这对我有意义。
我发现这篇文章Cost of Include Header Files in Objective-C并发现它很有启发性。
我不明白为什么有一个单独的头文件 .h 用于实例声明和变量声明,然后在类文件 .m 中编写我的类。
为什么不像解释语言那样呢?只需声明一个函数并在需要时引用它。对我来说似乎有很多重复的代码,我希望这对我有意义。
我发现这篇文章Cost of Include Header Files in Objective-C并发现它很有启发性。
这更像是一个好的编程实践/标准,而不是一个硬性规则。您当然可以在 .m 文件中进行声明(尝试一下),就像在解释语言中一样,但通常我们不会这样做,因为它没有那么有条理。
另一个原因是模块化。但这是一条你需要先学习编程基础才能钓到的大鱼;)
这与在 C 中相同,当您想从另一个翻译单元访问一个翻译单元中的某些内容时,必须声明该内容。然后在链接时,链接器将看到您正在访问在另一个翻译单元中定义的对象的声明并修复问题,以便您确实跨翻译单元边界使用该东西。
然而,这取决于翻译单元之间的声明是否相同。如果没有头文件,您将不得不在两个 TU 中写出相同的声明,并且每次您在一个 TU 中更改声明时,您都必须在其他 TU 中更改它。
标题的存在使得声明可以编写一次,然后“包含”在您想要使用该项目的任何翻译单元中,而无需仔细和手动同步文件。
其他答案没有提到的一件事是头文件中定义的方法是公共的。头文件公开了允许其他类使用的接口,而在实现文件中,您经常会看到如下内容:
@interface MyClass (PrivateAPI)
- (void)myPrivateMethod;
@end
@implementation MyClass
// All of the method implementations.
@end
这样只有在 MyClass 实现范围内的代码才能真正调用 myPrivateMethod。这是封装实践中非常普遍和重要的技术。
您可以.h
在其他几个地方包含一个文件,而不必包含.m
,这会导致每次都重复代码。
总而言之,通过包含头文件 (.h),您告诉编译器“函数在这里,这是它们的签名”(看到这里的关键字?)。通过包含实现 (.m),您可以告诉编译器“这是前面定义的函数的代码”。