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 开发的标配。