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

Asa*_*han 51 objective-c

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

zou*_*oul 95

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

@class Foo;
@interface Bar : NSObject {
    Foo *someFoo;
}
@end
Run Code Online (Sandbox Code Playgroud)

当然你可以导入标题Foo:

#import "Foo.h"
@interface Bar : NSObject {
    Foo *someFoo;
}
@end
Run Code Online (Sandbox Code Playgroud)

但如果someFoo没有向用户公开Bar,他们会导入一个对他们没用的额外头文件.随着@class声明用户Bar看到没有额外的导入,因为Foo.h将导入在实现文件中Bar.


jus*_*tin 24

它被称为前瞻性声明.

您使用此指令告诉编译器存在指定名称的objc类.您的其他选项是包括接口,或使用id作为变量或类型.

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

它与c和c ++中的相同:

struct mon_struct;
namespace MON { class mon_class; }
Run Code Online (Sandbox Code Playgroud)

  • 小费为+1,这应该是首选,以减少构建时间. (3认同)

Anu*_*uni 8

希望这会有所帮助

以上答案已经说明了几乎所有的事情,我想在其上添加一些东西.

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

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