在每个源文件中包含标题的缺点(Objective-C)

时间:2010-05-17 12:21:44

标签: c objective-c

我目前正在使用AppDelegate.h前缀标题将我的MyApp_Prefix.pch和所有类别标题包含到我的每个源文件中,而不是手动#import只将它们放在它们的位置使用。我的应用程序委托中的类别方法和大量编译器#define在我的代码中的许多地方使用。

这有什么不妥的吗?只是编译需要更长的时间吗?

2 个答案:

答案 0 :(得分:1)

源级别依赖项。 通过有效地将标头导入每个源文件,这意味着每个源文件都可能依赖于它,但依赖关系不可见。 源级别依赖性是阴险的。当你不看时它们会爬起来,然后很难解开它们。 他们可能会引入其他恶意内容,例如包含文件排序问题。

OTOH对于小型项目来说,这在很多时候可能不是一个大问题。

尽管如此,对于我个人而言,我习惯于不必要地依赖于另一个源文件 - 这意味着我的头文件很少#import其他(非框架)头文件。在Objective-C中,您通常可以比C ++更干净地执行此操作,因为您始终通过指针保存Objective-C对象,因此它们只需要在标头中使用前向声明。

答案 1 :(得分:1)

  

这有什么不妥的吗?只是编译需要更长的时间吗?

不,不是真的。这意味着每次对任何标题进行更改时,整个项目都会重新编译。但另一方面,因为它是预编译的,所以在需要重新编译但不更改标题的情况下可能会有节省。

将所有标题填充到pch文件中是有好处的,因为这意味着您不太可能意外地省略标题。有时,如果Objective-C没有头文件,则编译错误。如果你有两个类的方法声明如下:

-(void) doSomethingWith: (float) aNumber;

-(void) doSomethingWith: (double) aNumber;

没有正确的标题,Objective-C可能猜错了doSomethingWith:并且在预期浮点数时传递一个double,反之亦然。

说了这么多,我从不打扰pch。我倾向于只在可能的情况下导入.m文件中的头文件,并在头文件中转发声明类。