@class

2010-08-07 65 views
12

“无法找到接口声明错误...”我遇到了似乎对我没有任何意义的Objective-C问题。我是一位相对熟练的ObjC程序员,理解整个“前向声明”的概念,但是这个让我挠头。所以这里的交易:@class

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

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

任何帮助将不胜感激,我希望这是有道理的。谢谢!

回答

10

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

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

+0

嗯,我想尽可能多。但是,这使我不确定在这里做什么。我想我留下的唯一路线是公开超类,并简单地记录说不建议使用超类。 – Grimless 2010-08-07 19:56:30

+1

啊,是的。抽象的超类。我建议你阅读关于Class Clusters的内容,因为它们会延续类似的设计模式。 – bbum 2010-08-07 20:51:41

+0

不幸的是,我不相信类集群解决这个问题。类集群隐藏提供特定功能的子类。我试图隐藏*超类*,同时仍然公开可用的子类。无论如何,谢谢你的洞察力! – Grimless 2010-08-08 00:17:36

37

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

1

我有一个问题,我在超类方法中使用类别,并得到这个继承错误。一旦我将类别.h导入到超类.m文件中,事情开始变得越来越好。

6

我有一个答案:你必须检查你的#import命令。在使用超类之前,应该导入并编译它。

1

只需执行超类的.h文件到.m文件的所有可能的标题,并查看哪一个是问题的问题。我确定这是两个类中使用的常见标题之一。

0

像@Igor说,进口事项的顺序:

我不得不改变

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

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