【问题标题】:Mutual dependencies in Cocoa causing compilation errors [duplicate]Cocoa中的相互依赖导致编译错误[重复]
【发布时间】:2013-01-04 04:56:55
【问题描述】:

可能重复:
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

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

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

【问题讨论】:

    标签: xcode cocoa header inclusion


    【解决方案1】:

    您不需要包含任何一个标题。使用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
    

    根据您的情况,您可能还需要在ClassB.m 中添加#import "ClassA.h",反之亦然。但这不会导致任何额外的问题。

    【讨论】:

    • 太棒了。谢谢。尽可能使用前向声明而不是导入是一种好习惯,还是只要我没有遇到上述问题就可以坚持使用导入?
    • 这通常是一个好习惯。当编译器和计算机速度较慢时,这一点要重要得多。如今,在您的项目或头文件变得庞大之前,它不太可能产生明显的影响。我的印象是它在 C++ 中更重要,但可能同样已经过时了。
    猜你喜欢
    • 2015-10-03
    • 2019-12-05
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多