Cocoa中的相互依赖导致编译错误

时间:2013-01-04 04:56:56

标签: xcode cocoa header inclusion

  

可能重复:
  How can I solve this Problem with bidirectional dependencies in Objective-C classes?

为什么我会使用以下代码获得“解析问题 - 预期类型”,如何解决问题(不更改测试函数的API)?

// ClassA.h

#define CLASSA_H

#import <Foundation/Foundation.h>
#ifndef CLASSB_H
#import "ClassB.h"
#endif

@interface ClassA : NSObject {}

- (void)test:(ClassB *)input;  // Compiler error: Expected ClassB to be a type

@end

// ClassB.h

#define CLASSB_H

#import <Foundation/Foundation.h>
#ifndef CLASSA_H
#import "ClassA.h"
#endif

@interface ClassB : NSObject{}

- (void)test:(ClassA *)input;  // Compiler error: Expected ClassA to be a type

@end

基于我读到的关于import和include的内容,我甚至不必使用CLASSA_H和CLASSB_H宏来防止自包含,但无论我是否使用它们,我都会得到同样的错误。

我的实际代码比上面的示例更复杂,但它归结为我的两个类的接口相互引用,因此要求每个头包含另一个,如上例所示。这是C中的常见情况,我不会得到我在这里缺少的东西。

1 个答案:

答案 0 :(得分:2)

您不需要包含任何标头。使用forward declaration

// ClassA.h

#import <Foundation/Foundation.h>

@class ClassB;

@interface ClassA : NSObject {}

- (void)test:(ClassB *)input;

@end

// ClassB.h

#import <Foundation/Foundation.h>

@class ClassA;

@interface ClassB : NSObject {}

- (void)test:(ClassA *)input;

@end

根据您的具体情况,您可能还需要#import "ClassA.h"ClassB.m,反之亦然。但这不会引起任何其他问题。