iPhone SDK:#import和@class有什么区别?

时间:2010-05-02 12:55:21

标签: iphone

我们可以使用#import导入类声明:

#import "SomeClass.h"

或使用@class声明:

@class SomeClass;

有什么区别,什么时候应该使用它们?

1 个答案:

答案 0 :(得分:11)

“导入”链接其包含的头文件。标题中的所有内容(包括属性定义,方法声明和标题中的任何导入)均可用。 Import为链接器提供实际定义。

相比之下,@ class只是告诉链接器不要抱怨它没有类的定义。这是一份“合同”,您将在另一点为该课程提供定义。

大多数情况下,您使用@class来阻止循环导入,即ClassA引用ClassB,因此它在自己的ClassA.h中导入ClassB.h,但ClassB也引用ClassA,因此它在ClassB.h中导入ClassA.h。由于import语句导入标头的导入,这会导致链接器进入无限循环。

将导入移动到实现文件(ClassA.m)可以防止这种情况,但是当ClassA.h中出现ClassB时,链接器将无法识别它。 @class ClassB;指令告诉链接器,在代码实际使用之前,您将为ClassB提供标头。