2012-11-29 68 views
1

我知道在.m和.m中输入一个前向类声明(@class ClassA)是正确的做法。而且我也知道这样做可以让编译器稍后编译它(直到#将它导入到.m中)。关于@class的正向类声明

通常我们在A.h中使用@class ClassA,同时在A.m中添加#import ClassA.h,尽管编译器在A.h中不编译ClassA,但编译器仍然需要在A.m.中编译它。 那么为什么不直接在A.h中使用#import呢?

+0

http://stackoverflow.com/questions/9177265/why-use-forward-declaration-rather-than-import-in-h-file?rq=1 – ohho

回答

2

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

你最后一句话似乎是问为什么我们从不在A.h.中输入A.h。我认为这很明显,为什么没有完成。

请记住,头文件(.h)旨在告诉世界关于您的声明的最小可能性。它告诉编译器 - “嗨,我们有一个包含一些方法和属性的类(@interface),并且这些方法使用这些其他的类。我们对其他类使用@class,因为在这个时候,我们只需要知道最终会有这样的类,这足以让编译器很高兴,因此它可以完成它的工作,最终,链接器会对这些类是否真的存在做出最终决定

源文件(.m )需要进行实际的导入,因为编译器需要验证是否真的有你正在使用的方法和属性,但头文件不调用方法,也不调用属性,它只是声明 - “This东西存在“

0

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

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

  2. 减少编译时间。

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