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