何时在实现文件中包含#import

时间:2011-03-21 21:14:00

标签: objective-c

学习Objective-C和其他基于c的语言我了解到你应该将#includes和#imports放在头文件中。 @class也去了那里。最近查看来自苹果和网络上其他来源的示例代码,@ class在标题中,所有导入都在实现文件中。

哪个是对的?两者都有原因吗?如果要导入头文件,为什么还需要提供@class声明。

2 个答案:

答案 0 :(得分:7)

两种情况都不是“更正确”,这两种行为都有明显的原因。例如,考虑一下你有两个类的情况,每个类都有一个对另一个类型的对象的引用:

ClassA.h:

@interface ClassA : NSObject
{
  ClassB *b;
}

ClassB.h:

@interface ClassB : NSObject
{
  ClassA *a;
}

此代码无法编译 - 您在这些标头中具有循环依赖关系。解决方案是使用@class指令转发声明所需的类。

您可能更喜欢头文件中的#import指令的情况可能是,除了您在其他标题中关注的类名之外还有一些常用代码 - 可能是C样式函数或枚举类型或东西。

答案 1 :(得分:2)

  

学习Objective-C和其他基于c的语言我了解到你应该将#includes和#imports放在头文件中。

不 - 不是基于c的语言。你应该尽可能将它们放在实现文件中。你不能总是创建一个零依赖性头,但你应该最小化它。

基于语言的语言需要很长时间才能编译,特别是当依赖项和包含非常复杂时,或者存在不必要的包含(引入更多依赖项时,巧合)。

  

@class也去了那里。最近查看来自苹果和Web上其他来源的示例代码,@ class在标题中,所有导入都在实现文件中。哪个是对的?

尽可能使用前向声明(@class NAME;@protocol NAME;struct NAME,NAME类;`等等。

  

两者都有原因吗?

包含在标题中是懒惰的方式,它会减慢构建时间并引入很多依赖项。它很方便,因为您不必编写尽可能多的包含/导入声明,但对于必须使用您的程序的人来说,这并不体贴。

  

如果要导入头文件,为什么还需要提供@class声明。

如果类接口已经可见(已经包含,或者其他文件已声明它),则不需要两者。如果您打算使用该类型(除了一些非常简单的情况),您将需要界面可见。

一旦你的构建时间变得缓慢,你肯定不会兴奋纠正错误 - 最好使用正确的方法学习和实施。如果你没有开发一个复杂的c项目,那么你可能会非常惊讶地发现在编译时会丢失多少时间。

如果您希望您的程序永远不会变得不重要,并且永远不会被共享或重复使用,那么请根据您的喜好进行操作。

祝你好运!