Objective-c中头文件的类和接口的关键字

时间:2011-09-22 08:52:59

标签: objective-c

  

可能重复:
  @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”吗?

2 个答案:

答案 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 使用前向声明时,必须注意只能将前向声明的类名用于类型引用。