【问题标题】:"Cannot find interface declaration error..." after @class@class 之后的“找不到接口声明错误...”
【发布时间】:2011-03-26 19:09:22
【问题描述】:

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

ClassA 是我的 Xcode 项目中的一个类,它是项目专用的。 ClassB 是 ClassA 的子类,它是公共的,并且被导入到我的框架的标题中。

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

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

【问题讨论】:

    标签: objective-c xcode


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      要子类化一个类,编译器必须可以使用超类的完整声明。 @class 只是启用对所述类的实例的引用——允许 A *foo;。

      子类化需要更多元数据(至少,它在旧版运行时下是这样的——我认为在没有完整超级的@interface 的情况下可能支持子类化。技术上可行,但可能没用。 )

      【讨论】:

      • 嗯,我也是这么想的。但是,这让我不确定在这里做什么。我想我剩下的唯一途径是公开超类,并简单地记录不建议使用超类。
      • 啊,是的。一个抽象超类。我建议您阅读有关 Class Clusters 的内容,因为它们延续了类似的设计模式。
      • 不幸的是,我认为类集群不能解决这个问题。类簇隐藏了提供特定功能的子类。我试图隐藏 superclass,同时仍然公开子类。无论如何,感谢您的洞察力!
      • 嗯……你总是可以在抽象的 super 中实现关键方法,@throw 调用时会出现异常。 “子类责任”是模式的名称,我在这里进行了描述:friday.com/bbum/2009/11/21/calling-python-from-objective-c
      • 在得到一个有效的解决方案并有时间再次考虑这个问题之后,我相信我已经想出了一个公平的解决方案。 “超类”实际上应该被转换为一个独立的对象,然后“子类”作为一个字段保存并用于公开依赖项目将无法访问的功能和内部状态。希望这是有道理的!
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            就像@Igor 所说,导入的顺序很重要:

            我必须改变

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

            到

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-26
              • 1970-01-01
              • 2011-11-27
              • 2017-03-25
              相关资源
              最近更新 更多