学习Objective-C和其他基于c的语言我了解到你应该将#includes和#imports放在头文件中。 @class也去了那里。最近查看来自苹果和网络上其他来源的示例代码,@ class在标题中,所有导入都在实现文件中。
哪个是对的?两者都有原因吗?如果要导入头文件,为什么还需要提供@class声明。
答案 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项目,那么你可能会非常惊讶地发现在编译时会丢失多少时间。如果您希望您的程序永远不会变得不重要,并且永远不会被共享或重复使用,那么请根据您的喜好进行操作。
祝你好运!