我知道在 .h 中放置前向类声明 (@class ClassA) 并在 .m 中放置#import "ClassA.h"是正确的做法。而且我知道这样做可以让编译器稍后编译它(直到 #import it in the .m)。
通常我们在A.h中使用@class ClassA同时在A.m中添加#import ClassA.h,虽然编译器不会在A.h中编译ClassA,但编译器仍然必须在A.m中编译它。 那么为什么不直接在 A.h 中使用#import呢?
最佳答案
你几乎从不在 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) 需要进行实际导入,因为编译器需要验证是否确实存在您尝试使用的方法和属性。但是头文件不调用方法,也不调用属性。它只是简单地说明 - “这个东西存在”。
关于objective-c - 关于@class 的前向类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618120/