第二篇: 在类的头文件中尽量少引入其他头文件
0、介绍
- 与C和C++一样, Objective-C也使用 “头文件” 与 “实现文件” 来去个代码。Objective-C语言编写”类”的标注方式为: 以类名做文件名, 分别创建两个文件, 头文件后缀用.h, 实现文件后缀用.m。
-
#include 和 #import 的区别, #import 具有防止重复引用的功能。在使用C语言时, 通常适用宏定义防止重复引用。
1、@class ClassName 的使用
- 头文件中引用 在头文件中声明某个类的对象时, 需要告诉编译器此类存在, 但又不需要知道类的全部细节。此时可以使用 “@class ClassName” 告诉编译器。这叫做: “向前声明”。(如果你写的类继承自某个超类, 则必须引入定义那个超类的头文件)
- 实现文件中引用 在实现文件中则需要引入类的头文件, 因为在实现文件中需要使用类的细节。
- 注意: 将引入头文件的时机尽量延后, 只有在确有需要时才引入, 这样就可以减少类的使用者所引入头文件数量。以减少程序的编译时间。
2、@class 和协议
-
同样如果要生命你写的类遵循某个协议, 那么该协议必须有完整定义, 且不能使用向前声明。向前声明只能告诉编译器有某个协议, 而此时编译器却要知道协议中定义的方法。 这样, 最好把协议单独放在一个头文件中. 要是把协议放在莫讴歌大得头文件里, 那么只要引入此协议, 就必定引入那个头文件中的全部内容, 这样就会产生相互依赖问题。 然而有些协议, 例如 “委托协议” 就不能单独写一个头文件。在这种情况下, 委托只有与协议委托的类放在一起定义才有意义。此时最好能再实现文件中声明此类实现了该类实现了委托协议, 并把这段实现代码放在”分类”里。这样的话, 只要在实现文件中引入包含委托协议的头文件即可, 而不需要将其放在公共头文件里。
3、注意
-
每次在头文件中引入其它头文件之前, 都要先问问自己这样做是否有必要. 如果可以向前声明取代引入, 那就不要引入。若因为要实现属性、示例变量或者要遵循协议而必须引入头文件, 则应尽量将其移至”分类”中. 这样做不仅可以缩减编译时间, 而且还能降低彼此依赖程度。若使依赖关系过于复杂, 则会给维护带来麻烦。
4、要点
-
一、除非确实有必要, 否则不要引入头文件。一般来说, 应该在某个类的头文件中使用向前声明, 并在实现文件中引入类的头文件。这样做可以尽量降低类之间的耦合。
-
二、有时候无法使用向前声明, 百日要声明某个类遵循一项协议。这种情况喜爱, 尽量把 该类遵循某项系协议 的声明移至 “分类” 中。如果无法实现, 就把协议单独放在一个头文件中, 然后将其引入。