在类的头文件中尽量 少 的引用其他头文件,尽量用 @class xxxxxx;
理解: 当你创建了一个 A 类,这个类又 需要具有 B 类的实例, 你可以直接为 A 类添加 B 类类型的 属性, 并引用 B 类的头文件 #import "B.h"
这种方法可行,但是不够优雅,在 编辑一个使用 A 类的文件时候, 不需要知道 B 类的全部细节, 只需要知道有一个 类名叫 B 就好, 所幸有个办法能把这一切情况告诉编辑器 @calss B;
这叫做 '向前声明' 该类
而 A 类的实现文件 .m文件 中则需要引入 B 类的头文件, #import "B.h" 因为若要使用后者, 则必须知道其所有的接口细节.
将引入头文件的时机尽量延后,只有确有需要时才引入, 这样就可以减少类的使用这所需引入头文件的数量, 假设 把 B.h 引入到 A.h 中, 那么只要进入 A.h, 就会一并引入 B.h 的所有内容, 此过程若继续下去, 则要引入许多根本用不到的内容, 这当然会增加编译时间.
向前声明 也解决了两个类互相引用的问题, 如果 A 类 和 B 类在各自的头文件中引入对方的头文件, 则会导致 "循环引用" ,当解析其中一个头文件时,编辑器会发现它引入的另一个头文件, 而那个头文件回过头引用第一个头文件, 使用 #import 而非 #include 指令虽然不会导致死循环, 单却以为着两个类有一个无法被正确编译
但是有时候必须要在头文件中引入其他头文件, 如果你写的类继承自某个超类, 则必须引入定义那个超类的 头文件, 同理, 如果要声明你写的类遵从某个协议, 那么该协议必须有完整定义, 且不能使用向前声明, 向前声明只能告诉编译器有某个协议, 而此时编译器却要知道该协议中定义的方法
总结: 除非确有必要, 否则不要引入头文件, 一般来说, 应该某个类的头文件中使用 向前声明 来提及别的类, 并在实现文件中引入那些类的头文件, 这样做可以尽量降低类之间的 耦合
网友评论