约翰给出了很好的建议,但这里有更多的背景,关于whys,因为和例外。
避免将标题导入标题有两个目的:改进增量构建时间和避免循环依赖。如果导入A.h
到B.h
并导入B.h
为C.h
,然后每次在A.h
改变任何东西的时候,你必须重新编译C.m
,即使C.m
是没有使用任何的A.h
定义的东西。这可能会导致非常可怕和不必要的构建流失,特别是如果您的头文件经常更改(如在开发的早期阶段常见)。
第一个目标值得称赞,但对于小型项目,谁在乎?你有一个四核Pro,一个完整的构建需要几分钟,对吧?但是你仍然需要担心第二个问题:循环依赖。 A.h
参考类别B
和B.h
参考类别A
。这实际上可能经常发生,并且可能非常无辜地进入系统。集合对象可能会引用其包含的对象的类型,并且对象可能会引用集合对象的类型。它只需要一个引用,因为某些方法需要或返回该类型。如果您有标题导入其他标题,则发生这种情况的可能性会迅速接近统一。你用递归导入结束了,编译时错误可能令人兴奋。 “我知道,typdef被定义了!它就在那里!它是进口的!“但是,当你导入这个头文件时,它还没有被解析,这是什么导致你的错误如上所述
因为这个原因,即使你不关心构建时间你应该),避免导入标题变为头......除了....
有些头你有进口。你当然父。文件定义@protocol
你实现或typedef
使用。所以,是的,你必须包括这些。
那么系统头怎么样?那么,他们永远不会去c因为他们不会引起递归进口,所以他们没事。我不鼓励人们在系统头文件中使用@class
转发声明。它为您的标题的用户创造了额外的工作,没有任何价值。要获得良好的标题卫生,请记住将系统标题放在<尖括号>中,并将标题放在“引号”中。
所以这不是一个小问题,但简单的规则是:避免在编译器允许的任何时候将用户头文件导入到其他用户头文件中。
'typedef's和'protocols'怎么样? – Joost
你不会碰巧知道一个教程,或者使用它的代码示例? – gargantuan