在我的控制器头文件中,我需要声明另一个控制器的实例。我是通过以下方式做到的:
#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
答案 0 :(得分:4)
使用@class BIDAnotherController
被称为BIDAnotherController
的前向声明,它基本上告诉编译器在将来的某个时刻将存在它的实现。
#import "BIDAnotherController.h"
实际上将BIDAnotherController.h
的内容包含在当前文件中。
如果您只需要使用BIDAnotherController
作为方法的属性或参数,则可以使用前向声明,因为除了存在之外,您的代码不需要知道任何有关它的信息。如果您需要使用BIDAnotherController
的属性或方法,那么您将需要导入其标头(否则编译器将不知道那些属性或方法甚至存在!)。
通常,前向声明用于中断两个或多个头文件之间的包含周期。防止循环的最简单方法是首选@class
声明,除非您确实需要访问类的属性或方法。