@class在Objective-C中做什么?

@class在Objective-C中做什么?,objective-c,Objective C,有谁能解释一下@class声明在Objective-C中的作用,以及我们应该在哪些情况下使用此声明?这是一个正向声明。它本质上告诉编译器有一个同名的类。我在接口声明中使用它: @class Foo; @interface Bar : NSObject { Foo *someFoo; } @end 当然,您可以导入Foo的标题: #import "Foo.h" @interface Bar : NSObject { Foo *someFoo; } @end 但是如果someFo

有谁能解释一下
@class
声明在Objective-C中的作用,以及我们应该在哪些情况下使用此声明?

这是一个正向声明。它本质上告诉编译器有一个同名的类。我在接口声明中使用它:

@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

的实现文件中,这称为前向声明

使用此指令可以告诉编译器有一个具有指定名称的objc类。您的其他选项包括接口,或者对变量或类型使用id

这有助于最小化依赖关系。我尽可能地使用它们来最小化依赖关系,并显著减少构建时间

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

struct mon_struct;
namespace MON { class mon_class; }

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


当您知道这个类的实现时,您可以实现它。

希望这对您的帮助不大

上面的答案已经说明了几乎每一件事,我想补充一些东西

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


注意:-当两个类相互需要时,类声明变得非常重要。如果我们使用通常的import语句,我们将有一个无止境的导入循环,编译器不喜欢无止境的循环。所以我们使用
@Classname

+1的小费,这应该是首选,以减少建设时间。我仍然不完全理解它,我知道这是一个老帖子,但和例子将是好的。您所说的“Bar用户”是什么意思?这些类将Bar作为一个对象?示例中的Imean Foo是Bar中的一个对象。那么在这种情况下,#import和@class有什么区别呢?这的确是一个很好的解释。我之前遇到了一个我本应该使用它的情况。无论如何,现在我当然可以了。:)@zoul…我在.h文件中使用转发声明;但是,我必须在.m文件中导入头文件,否则会出现错误,“类消息的接收方类型“***”是转发声明”。那么,为什么我不应该在头文件中导入文件,而不是进行转发声明呢?这样,我也可以在.m文件中重用它。如果在公共头中有一个Foo类型的实例变量和import Foo.h,则使用此头的任何人都将导入Foo.h,尽管他们可能根本不需要了解Foo(例如,它可能是一个私有变量).通过看那个例子,我很肯定你在谷歌工作