2

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

#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
4

1 回答 1

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

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

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

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

于 2013-05-01T14:54:35.210 回答