2010-10-11 53 views

回答

83

这是一个前向声明。它基本上告诉编译器有一个这样的名字。我用它在接口声明:

@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

明智的解释,刚刚学到了新东西!谢谢 – pnizzle 2013-05-31 00:13:35

+0

我还没有完全理解它,我知道它的一个旧帖子,但例子会很好。 “酒吧的用户”是什么意思,这些课程将酒吧作为其中的一个对象?在你的例子中,Imean是Bar中的一个对象。那么在这种情况下,在#import和@class之间的区别是什么? – Esko918 2015-08-20 23:07:38

+0

确实是一个很好的解释。我之前遇到过一个我应该使用它的情况。无论如何,现在我当然可以。 :) – Ron 2017-04-25 15:50:44

23

它被称为前向声明。

你使用这个指令告诉编译器有一个objc类和指定的名字。你的其他选项是包含接口,或使用变量或类型的id。

这有助于最小化依赖性。只要我能够最大限度地减少依赖关系,就可以使用它们,并大大减少构建时间

它等同于C和C++:

struct mon_struct; 
namespace MON { class mon_class; } 
+3

+1小费,这应该是首选,以减少构建时间。 – 2010-10-11 14:23:03

1

@class用于创建提出任何类的声明。如果您创建的任何类的实现不为您所知,那么您可以使用@class编译器指令来执行此操作。

当你知道实现时,你可以实现这个类。

8

希望这将有助于更多一点

上面的回答已经说明几乎所有的事情,我想补充一些关于它的事情。

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

注意: - 当两个类互相需要时,类声明变得非常重要。如果我们通常执行#import语句,那么我们会有一个无限循环的导入,并且编译器不喜欢无限循环。所以我们使用@class Classname

相关问题