@class在Objective-C中做了什么?

时间:2010-10-11 08:36:21

标签: objective-c

任何人都可以解释一下我在Objective-C中做出的@class声明做了什么,以及我们应该使用这个声明的情况是什么?

4 个答案:

答案 0 :(得分:91)

这是一个前瞻性声明。它基本上告诉编译器有一个类的名称。我在接口声明中使用它:

@class Foo;
@interface Bar : NSObject {
    Foo *someFoo;
}
@end

当然,您可以导入Foo的标题:

#import "Foo.h"
@interface Bar : NSObject {
    Foo *someFoo;
}
@end

但如果someFoo未向Bar的用户公开,则他们会导入一个对他们没用的额外头文件。使用@class声明时,Bar的用户看不到额外的导入,因为Foo.h将导入Bar的实施文件中。

答案 1 :(得分:24)

它被称为前瞻声明。

使用此伪指令告诉编译器有一个带有指定名称的objc类。您的其他选项包括接口,或使用id作为变量或类型。

这有助于最小化依赖性。每当我能够最小化依赖性时,我就会使用它们,并显着缩短构建时间。

与c和c ++相同:

struct mon_struct;
namespace MON { class mon_class; }

答案 2 :(得分:8)

希望这会有所帮助

以上回答几乎已经说明了所有内容,我想在其上添加一些内容。

@class Foo是Foo类的前向声明。这就像告诉编译器,foo类存在所以现在不要理会它。

注意: - 当两个类彼此需要时,类声明变得非常关键。如果我们通常使用#import语句,那么我们将拥有无限循环的导入,编译器不喜欢无限循环。所以我们使用@class Classname

答案 3 :(得分:1)

@class用于创建任何类的前向声明。如果您正在创建任何未知的实现类,那么您可以使用@class编译器指令执行此操作。

您可以在知道实现时实现此类。