The keyword of class and interface at header file in Objective-c
The keyword of class and interface at header file in Objective-c
这个问题已经有了答案:
可能是重复问题:
我是Objective-c的新手,我看到了一个例子,它看起来像这样:
#import <UIKit/UIKit.h> @class MapKitSampleViewController; @interface MapKitSampleAppDelegate : NSObject { UIWindow *window; MapKitSampleViewController *viewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet MapKitSampleViewController *viewController; @end
上面的代码存储在“MapKitSampleAppDelegate.h”文件中,我想问一下第三行的“@class MapKitSampleViewController;”的意思是什么?我们可以将其更改为“#import”MapKitSampleViewController.h” 吗?
是的,您可以更改它,但这将增加编译时间,并不会给您带来任何好处。
"@class MapKitSampleViewController;"是一种前向声明,参见http://en.wikipedia.org/wiki/Forward_declaration。
在使用前向声明时,您必须注意只能使用前向声明的类名作为类型引用。
我想问第三行的意思是什么,"MapKitSampleViewController"?我们可以将其更改为#import "MapKitSampleViewController.h"吗?
可以。
@class关键字是一个"向前声明"。你告诉编译器的是这个类将在这个类中使用,但是它的头文件导入在其他地方。
如果你打开.m文件,大多数情况下,你会发现#import "MapKitSampleViewController.h"会在那里。
为什么?
我认为实现这个的原因是为了避免循环导入。想象一下以下情况:
Class1.h
#import Class2.h
Class2.h
#import Class1.h
现在,如果我没有错的话,在编译过程中,它会反复导入两个头文件并且会出现问题。@class关键字的作用是防止这种情况发生,因为这些文件的导入将在.m文件中进行,而不是在.h文件中。
顺便说一下,这是@class vs. #import的副本。
因此,在那个问题中,你可能会找到更深入的讨论。