第七章:文件与头文件 —— 你的入场券

7.1 .h 与 .m 的分离

C 语言的遗产。 任何一个 OC 类通常需要两个文件:

  • Header (.h): 你的脸。你要告诉别人你是谁,你有什么公开的方法。
  • Implementation (.m): 你的心。你实际上是怎么干活的。

这种分离在几十年前是为了提高编译速度(不用每次都解析实现细节),也是为了封装(虽然 OC 的封装是防君子不防小人的)。

什么是 .mm?

如果你看到 .mm 文件,别怕。那是 Objective-C++。 它是 OC 和 C++ 的混血儿。在那个文件里,你可以左手写 std::vector,右手写 [NSArray array]。 这是通往 C++ 庞大生态库的桥梁。

7.2 #import 与 @class

在 C 里面,我们用 #include。 在 OC 里,请永远使用 #import#import 聪明一点,它保证同一个文件只会被包含一次,不会让你出现“重定义”的错误。

面试必考题:#import 与 @class 的区别?

  • #import "Person.h": 我不仅知道有一个类叫 Person,我还知道它内裤是什么颜色的(知道它所有的公开属性和方法)。
  • @class Person;: 我只知道有一个叫 Person 的东西,至于它具体长啥样,我不关心。我只需要能声明 Person *p 这个指针就行了。

这也是解决 循环引用(Circular Dependency) 的唯一解药:A 引用 B,B 引用 A时,至少有一方由于只能用 @class

7.3 pch 与 module

以前,我们把所有通用的头文件(比如 UIKit)都塞进 Prefix.pch 里,这样就不用每个文件都写 import。 但这样会让编译变慢。

后来,Apple 发明了 Modules (@import UIKit;)。 它预编译了模块,极大地加速了编译,而且让你不再需要手动去 Link 二进制库文件。 这是现代 OC 开发的标配。

使用 Hugo 构建
主题 StackJimmy 设计