我遇到了一个似乎对我没有任何意义的Objective-C问题。我是一个相对精通的ObjC程序员,理解整个“前瞻性宣言”的概念,但这个让我摸不着头脑。所以这是交易:
ClassA是我的Xcode项目中的一个类,它只是项目。 ClassB是ClassA的子类,它是公共的,并被导入到我的框架的头文件中。
我在构建时遇到“无法找到'ClassA'的接口声明,'ClassB'的超类......”错误。我已经在ClassB.h中放了@class ClassA;
前向声明,但这似乎并没有解决问题。当我将@class ClassA;
更改为#import ClassA.h
时,它可以正常工作。但是,由于ClassA只是项目,因此依赖项目无法构建ClassB,因为它无法访问ClassA的源。
任何帮助都将受到赞赏,我希望这是有道理的。谢谢!
答案 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>