1

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

通常我们在Ah中使用@class ClassA同时在Am中添加#import ClassA.h,虽然编译器不会在Ah中编译ClassA,但编译器还是要在Am中编译,那么为什么不直接在Ah中使用#import呢?

4

2 回答 2

2

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

你的最后一句话似乎在问为什么我们从不导入 Ah in Ah 我认为很明显为什么没有这样做。

请记住,头文件 (.h) 旨在告诉全世界您的声明的最低限度。它在那里告诉编译器 - “嘿,我们有一个类(@interface),其中包含一些方法和属性。这些方法使用这些其他类。我们对那些其他类使用@class,因为此时我们只需要知道最终会有这样的类。这足以让编译器高兴,这样它就可以完成它的工作。最终,链接器会最终决定这些类是否真的存在于某个地方。

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

于 2012-11-29T04:07:08.590 回答
0

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

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

  2. 减少编译时间。

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

于 2013-01-11T10:02:55.350 回答