-
当我们在定义一个类C1的接口时,通常会在声明方法的时候,使用到另外一个类C2作为方法的参数,当时这个类并不知道这个作为参数类的任何信息,于是我们通常会直接把作为参数的类C2的头文件直接导入到正在创建类C1的头文件中。这种做法可以解决眼前的问题,但是这种做法很糟糕。理由有两点:
- 当有其他的类C3需要用到C1类的时候,我们如果还是按照这个方法导入C1头文件,那么C2头文件也会被导入,如果还有一个类C4要用到C3,那么其导入的头文件就更多了。所以,这种做法会增加编译时间。
- 如果有两个类C1和类C2,他们互相引用,就会产生到底是先有鸡还是先有蛋的这种问题(循环引用)。当其中一个类C1进行语法解析的时候,它会导入另外一个类C2,C2这个类又导入了C1。这种导入(#import)会陷入无限循环,最后的结果是,没有一个类能够被正确的编译。
为了解决这些存在的问题,一种更佳的实践方案是,在类C1的头文件中使用 @class 命令(@class C2;),在实现文件中导入C2(#import "C2"),在C2文件中的做法与此同理。
2 . 在声明一个类遵从某项协议时,我们不能使用向前声明,取而代之的做法是,把协议编码在单独的一对文件中,然后在类的声明中导入这对文件(.h /.m)的头文件。