0

可能重复:
如何在 Objective-C 类中通过双向依赖解决这个问题?

为什么我会收到带有以下代码的“解析问题 - 预期类型”,我该怎么做才能解决它(不更改我的测试函数的 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

根据我读到的关于导入与包含的内容,我什至不必使用 CLASSA_H 和 CLASSB_H 宏来防止自包含,但无论我是否使用它们,我都会得到同样的错误。

我的实际代码比上面的示例更复杂,但归结为我有两个接口相互引用的类,因此要求每个标题都包含另一个标题,如上面的示例所示。这是 C 语言中的常见情况,我不明白我在这里缺少什么。

4

1 回答 1

2

您不需要包含任何一个标题。使用前向声明

// 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"inside of ClassB.m,反之亦然。但这不会引起任何额外的问题。

于 2013-01-04T05:18:24.807 回答