可能重复:
@class vs. #import
我是Objective-c的新手,我看过一个例子:
#import <UIKit/UIKit.h>
@class MapKitSampleViewController;
@interface MapKitSampleAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
MapKitSampleViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MapKitSampleViewController *viewController;
@end
上面的代码存储在“MapKitSampleAppDelegate.h”文件中,我想问一下第3行“@class MapKitSampleViewController;”是什么意思?我们可以将它更改为#import“MapKitSampleViewController.h”吗?
答案 0 :(得分:7)
我想问一下第3行的含义是什么 “MapKitSampleViewController”?我们可以将其更改为#import “MapKitSampleViewController.h”?
是
@class关键字是“前向声明”。你告诉编译器的是这个类将在这个类中使用,但它的标题导入将在其他地方。
如果查看.m文件,很可能会发现#import“MapKitSampleViewController.h”就在那里。
<强>为什么吗
实施这一目标的原因(我认为无论如何)是为了防止循环进口。想象一下发生以下情况:
Class1.h
#import Class2.h
Class2.h
#import Class1.h
现在,如果我没有错,那么这里发生的是在编译期间,它会反复导入标题和坏事。 @class关键字用于防止这种情况发生,因为这些文件的导入将在.m文件中进行,而不是在.h文件中。
BTW这是@class vs. #import
的副本因此,您可能会在该问题上找到关于此主题的更深入的讨论。
答案 1 :(得分:0)
是的,您可以更改它,但这会增加编译时间,并且不会给您带来任何好处。
“@class MapKitSampleViewController;”是前瞻性声明,请参阅http://en.wikipedia.org/wiki/Forward_declaration 使用前向声明时,必须注意只能将前向声明的类名用于类型引用。