关于@class的前向类声明

时间:2012-11-29 02:59:08

标签: objective-c ios

我知道在.m和.h中的#hmport“ClassA.h”中放置一个前向类声明(@class ClassA)是正确的做法。而且我知道这样做可以让编译器稍后编译它(直到在.m中#import它。)

通常我们在A.h中使用@class ClassA,同时在A.m中添加#import ClassA.h,虽然编译器不会在A.h中编译ClassA,但编译器必须在A.m中编译它。 那么为什么不直接在A.h中使用#import?

2 个答案:

答案 0 :(得分:2)

你几乎不会在A.h.中使用@Class A。通常的做法是在A.h使用@Class B,在B.h使用@Class A。这样做的原因是为了避免.h文件中的循环依赖。如果A.h导入B.h和B.h导入A.h,编译器将从循环依赖中爆炸。

你的最后一句似乎在问我们为什么不在A.h.中导入A.h.我认为很明显为什么没有这样做。

请记住,头文件(.h)旨在告诉全世界关于声明的最小可能性。在那里告诉编译器 - “嘿,我们有一个类(@interface)有一些方法和属性。这些方法使用这些其他类。我们使用@class用于其他类,因为在这个时间点我们只需要知道最终会有这样的类。这足以让编译器开心,这样它就能完成它的工作。最终,链接器最终决定这些类是否确实存在于某个地方。

源文件(.m)需要进行实际导入,因为编译器需要验证确实存在您尝试使用的方法和属性。但是头文件不调用方法,也不调用属性。它只是说 - “这个东西存在”。

答案 1 :(得分:0)

我在.h中使用@class而不是#import有两个原因:

  1. 使循环依赖成为可能。

  2. 缩短编译时间。

  3. 我通常发现有相互链接A-> B和B-> A很有用,如果没有前向声明,这是不可能的。

相关问题