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

#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替换#importBIDAnotherController语句:
#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

最佳答案

  • 使用@class BIDAnotherController称为BIDAnotherController的前向声明,它基本上告诉编译器在将来某个时候将存在针对该声明的实现。
  • #import "BIDAnotherController.h"实际上将BIDAnotherController.h的内容包含到当前文件中。

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

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

    10-06 12:39