获取"重复接口定义"错误,必须#import ing头文件

Cow*_*oes 19 xcode objective-c ios

我正在帮助一个iOS项目,其中包含AppDelegate中许多不同类所共有的许多方法和定义.因此,在每个类中,在.h文件中,我使用#import"AppDelegate.h".这工作正常,直到我需要访问其中一个已经将AppDelegate导入另一个导入AppDelegate的类的类.此时,我收到了AppDelegate的重复接口定义错误.

好的,这看起来很公平.我已经将AppDelegate导入到我正在导入的文件中,因此AppDelegate正从两个不同的地方导入.所以我删除了AppDelegate系列,一切都很好.

但是当我需要导入两个需要导入AppDelegate的类时会发生什么?

我有一个非常具体的问题,我正试图包围我,我知道这是由与此有关的事情引起的,但我不确定是什么.所以我希望如果我弄清楚我应该如何处理这种导入,并将其他所有内容排序,并希望这能解决我的问题.所以更具体地说:

我有ClassA.h,ClassB.h和ClassC.h.所有人都有#import"AppDelegate.h".当我需要在ClassA中使用#import"ClassB.h"时,我从ClassA中删除#import"AppDelegate.h"行.一切顺利.但是,如果我还需要#Import"ClassC.h"进入ClassA,但ClassB和ClassC需要#import"AppDelegate.h",会发生什么?

编辑:

我在一个干净的项目中尝试了上面描述的确切场景,它构建得很好,所以还有其他的东西在起作用.但我可以肯定地说,当这个问题出现在此项目之前,它是AppDelegate的重复接口定义,当我删除#import"AppDelegate.h"行时,错误就消失了,我仍然可以通过其他导入的文件访问AppDelegate.h方法和枚举.

Car*_*zey 28

最好的预防和治疗方法是遵循一些关于何时从头文件导入的指导原则.作为一般规则,除非在这些情况下,否则永远不要从Objective-C标头导入:

  1. 您需要扩展在另一个标头中声明的类.
  2. 您需要声明与另一个标头中声明的协议的一致性.
  3. 您需要引用公共方法和/或属性中另一个头中定义的非类非协议类型.指协议和类,向前声明它们@class@protocol@class ClassFromOtherHeader;

其他人#import都应该参与你的实施.我的建议是#import根据这些规则开始将所有语句从标题中移出到实现文件中.从您认为是问题根源的文件开始,然后向外移动.这将解决您的问题,并为您提供更清晰的代码和更快的构建时间的附带好处.


pof*_*off 20

对我来说,上述答案都没有帮助,这里给出的答案也没有用.

为我修复的是关闭Xcode,转到〜/ Library/Developer/Xcode/DerivedData并删除与该项目相关的所有派生数据.之后我重新打开了这个项目并且工作正常.

希望有人帮助!