Objective-C的#进口环(Objective-C #import loop)

2019-06-17 23:41发布

我有以下代码:

#import <Foundation/Foundation.h>
#import "ServerRequest.h" // works even though this line is included
#import "ServerResponseRecord.h"

@protocol ServerRequestDelegate<NSObject>

-(void)request:(id)request gotResponseRecord:(ServerResponseRecord*)response;
-(void)request:(id)request gotError:(NSError*)error;

@end

它编译并运行良好。 但是,如果我用替换法的声明:

-(void)request:(ServerRequest*)request gotResponseRecord:(ServerResponseRecord*)response;
-(void)request:(ServerRequest*)request gotError:(NSError*)error;

我得到了意外的语法错误“错误:‘ServerRequest’之前预期‘)’”。 我认为这可能是一个问题的唯一原因是,ServerRequestDelegate.h和ServerRequest.h #IMPORT对方。 不过,我不明白为什么代码工作与(ID)请求#进口线。 我也弄不明白为什么这是一个语法错误。

有人可以提供一个很好的解释?

Answer 1:

一个#进口周期:你已经在解释暗示。

我做的第一件事就是取下#include ,并添加上述以下行@protocol定义:

@class ServerRequest;

这是一个正向类的声明,并可以帮助打破进口环。 看看这太问题的更多细节。 苹果也有一个简短的说明本指南 。

基本上, #import “荷兰国际集团文件使编译器把该文件的整个文本有问题的文件,虽然#import比‘聪明’ #include ,这并不意味着你是从导入错误免疫。 该@class声明的方式来告诉大家,一类存在不导入标题中的编译器。 这是适当的时候你只需要知道类名来使用,但不关心它提供了方法。 一般情况下,要使用@class在.h文件和#import在.m文件,在这里你实际上与类交互。



Answer 2:

#进口“循环”是没有问题的。 #进口相同的#include不同的是它追踪文件,并确保预处理器只读取他们的第一次。

通常,当你得到这样的错误,这是由于所包含的文件有问题。 因此,错误可能是ServerResponseRecord.h,认为它可能正在通过实际使用它声明的对象跳闸。 在没有看到完整的头,不可能说究竟是怎么回事。



文章来源: Objective-C #import loop