The keyword of class and interface at header file in Objective-c

18 浏览
0 Comments

The keyword of class and interface at header file in Objective-c

这个问题已经有了答案

可能是重复问题:

@class vs. #import

我是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” 吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

是的,您可以更改它,但这将增加编译时间,并不会给您带来任何好处。

"@class MapKitSampleViewController;"是一种前向声明,参见http://en.wikipedia.org/wiki/Forward_declaration
在使用前向声明时,您必须注意只能使用前向声明的类名作为类型引用。

0
0 Comments

我想问第三行的意思是什么,"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的副本。

因此,在那个问题中,你可能会找到更深入的讨论。

0