在我的简单案例中#import和@class之间的区别

时间:2013-05-01 14:48:58

标签: ios objective-c uiviewcontroller forward-declaration

在我的控制器头文件中,我需要声明另一个控制器的实例。我是通过以下方式做到的:

#import "BIDMyRootController.h"
#import "BIDAnotherController.h" //I import another controller's header

@interface BIDCurrentController : BIDMyRootController

//I declare an instance of another controller
@property (strong, nonatomic) BIDAnotherController *anotherController;

@end

以上代码非常简单。没问题!

但我也注意到,或者,我可以使用@class替换#import语句BIDAnotherController,方法如下:

#import "BIDMyRootController.h"
@class BIDAnotherController //I declare another controller with @class tag

@interface BIDCurrentController : BIDMyRootController

//I declare an instance of another controller
@property (strong, nonatomic) BIDAnotherController *anotherController;

@end

也没问题!

但我现在感到困惑,#import "BIDAnotherController.h"@class BIDAnotherController之间有什么区别,如果它们都可以呢???


更新

顺便说一句,在BIDCurrentController的实施文件中,我再次导入了BIDAnotherController

#import "BIDCurrentController.h"
#import "BIDAnotherController.h" //import another controller again
@implementation BIDCurrentController
...
@end

1 个答案:

答案 0 :(得分:4)

  • 使用@class BIDAnotherController被称为BIDAnotherController的前向声明,它基本上告诉编译器在将来的某个时刻将存在它的实现。

  • #import "BIDAnotherController.h"实际上将BIDAnotherController.h的内容包含在当前文件中。

如果您只需要使用BIDAnotherController作为方法的属性或参数,则可以使用前向声明,因为除了存在之外,您的代码不需要知道任何有关它的信息。如果您需要使用BIDAnotherController的属性或方法,那么您将需要导入其标头(否则编译器将不知道那些属性或方法甚至存在!)。

通常,前向声明用于中断两个或多个头文件之间的包含周期。防止循环的最简单方法是首选@class声明,除非您确实需要访问类的属性或方法。