【问题标题】:The keyword of class and interface at header file in Objective-c [duplicate]Objective-c头文件中类和接口的关键字[重复]
【发布时间】:2011-11-22 15:35:48
【问题描述】:

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我想问一下第3行是什么意思 “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的副本

      因此,您可能会在该问题上找到有关该主题的更深入讨论。

      【讨论】:

      • +1 还可以注意到,这与 C++ 中的前向声明与#include 相同。
      • 是的,#import "MapKitSampleViewController.h" 在 .m 文件中。那么,.h文件中是否需要写@class XXX?
      • @Charles Yeung 没有必要(如,它会编译得很好),但建议作为防止我描述的问题的好习惯。
      • 感谢信息,很有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2012-09-27
      相关资源
      最近更新 更多