@class之后“找不到接口声明错误...”

时间:2010-08-07 19:43:00

标签: objective-c xcode

我遇到了一个似乎对我没有任何意义的Objective-C问题。我是一个相对精通的ObjC程序员,理解整个“前瞻性宣言”的概念,但这个让我摸不着头脑。所以这是交易:

ClassA是我的Xcode项目中的一个类,它只是项目。 ClassB是ClassA的子类,它是公共的,并被导入到我的框架的头文件中。

我在构建时遇到“无法找到'ClassA'的接口声明,'ClassB'的超类......”错误。我已经在ClassB.h中放了@class ClassA;前向声明,但这似乎并没有解决问题。当我将@class ClassA;更改为#import ClassA.h时,它可以正常工作。但是,由于ClassA只是项目,因此依赖项目无法构建ClassB,因为它无法访问ClassA的源。

任何帮助都将受到赞赏,我希望这是有道理的。谢谢!

6 个答案:

答案 0 :(得分:37)

问题是你的#imports中有一个无限循环。 解决方案:所有#imports都进入实现文件,所有需要的类都在.h文件中声明。

答案 1 :(得分:10)

要为类创建子类,超类的完整声明必须可供编译器使用。 @class只允许引用所述类的实例 - 允许A *foo;

子类化需要更多元数据(至少,它在传统运行时下完成 - 我认为它可能支持子类而没有完整的超级@interface。技术上可行,但可能没用。 )

答案 2 :(得分:6)

我有一个答案:您必须检查'#import'订单。在使用超类之前,应该导入并编译它。

答案 3 :(得分:1)

我遇到了一个问题,我在超类方法中使用类别并且正在获得此继承错误。一旦我将类别.h导入移动到超类.m文件就开始变得更好了。

答案 4 :(得分:1)

只需执行从.h到.m文件的超类的所有可能标头,看看哪个是问题的问题。我确信它是两个类中常用标题之一。

答案 5 :(得分:0)

就像@Igor所说,进口的顺序很重要:

我不得不改变

#import <KeychainItemWrapper/KeychainItemWrapper.h>
#import <Foundation/Foundation.h>

#import <Foundation/Foundation.h>
#import <KeychainItemWrapper/KeychainItemWrapper.h>