任何人都可以解释一下我在Objective-C中做出的@class
声明做了什么,以及我们应该使用这个声明的情况是什么?
答案 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
编译器指令执行此操作。
您可以在知道实现时实现此类。