2011-09-22 50 views
2

可能重复的关键字:
@class vs. #import类和接口的头文件使用Objective-C

我是新来的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”文件中,我想问一下lin是什么意思e 3“@class MapKitSampleViewController;”?我们可以将其更改为#import“MapKitSampleViewController.h”吗?

回答

6

我想问的是3号线 “MapKitSampleViewController”的含义是什么?我们可以将其更改为#import “MapKitSampleViewController.h”?

是的。

@class关键字是“前向声明”。你告诉编译器的是这个类将在这个类中使用,但是它的头部导入将在别处。

如果你在.m文件中查看,你会发现#import“MapKitSampleViewController.h”将会出现在这里。

为什么?

为什么这样实施(我想,无论如何),是为了防止循环进口。想象一下这样一个场景,将出现以下情况:

Class1.h

​​

Class2.h现在

#import Class1.h 

,如果我没有错,这里所发生的是,在编译过程中,它会反复导入标题和不良内容。 @class关键字旨在防止发生这种情况,因为这些文件的导入将发生在.m文件中,而不是在.h文件中。

BTW这是@class vs. #import

重复所以,你可能会发现在那个问题,这个话题更深入的论述。

+0

+1还可以注意到,这与C++中的前向声明和#include一样。 – jv42

+0

是的,#import“MapKitSampleViewController.h”在.m文件中。那么,是否有必要在.h文件中写入@class XXX? –

+0

@Charles Yeung它没有必要(因为它会编译得很好),但推荐它是防止我描述的问题的良好实践。 –

0

是的,你可以改变它,但这会增加编译时间,并且不会带来任何好处。

“@class MapKitSampleViewController;”是一个前向声明请参见http://en.wikipedia.org/wiki/Forward_declaration 当使用前向声明时,您必须注意,只能为类型引用使用正向声明的类名称。