获取“重复接口定义”错误,肯定要#import ing头文件
我正在帮助一个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”行。 一切顺利。 但是,如果我还需要#将“ClassC.h”导入到ClassA中,而ClassB和ClassC需要#import“AppDelegate.h”,会发生什么?
编辑:
我在一个干净的项目中尝试了上面描述的确切场景,并且构build得很好,所以还有其他的东西在起作用。 但我可以肯定地说,当这个问题出现在这个项目之前,它是一个重复的AppDelegate接口定义,当我删除#import“AppDelegate.h”这一行时,错误消失了,而且我仍然有权访问AppDelegate.h方法并通过其他导入的文件枚举。
最好的预防和治疗方法是遵循一些关于何时从头文件导入的指导。 一般来说,除了这些情况外,不要从Objective-C头文件中导入:
- 您需要扩展在另一个头中声明的类。
- 您需要声明符合另一个头中声明的协议。
- 您需要引用公共方法和/或属性中另一个头中定义的非类,非协议types。 要引用协议和类,请使用
@class
或@protocol
将其声明为@class ClassFromOtherHeader;
其他#import
应该在您的实施。 我的build议是根据这些规则开始将所有#import
语句从头文件移动到实现文件中。 从您认为是问题根源的文件开始,向外移动。 这将解决您的问题,并为您提供更清晰的代码和更快的构build时间的副作用。
对于我来说,上述答案都没有帮助, 这里给出的答案也没有起作用。
什么修复它是closuresXcode,去〜/库/开发/ Xcode / DerivedData和删除所有与该项目相关的派生数据。 之后,我重新开放了这个项目,工作正常。
希望帮助别人!
就我而言,所提到的解决scheme都没有解决这个问题。 Xcode报告了我在Swift中重写的类的重复接口。 不知怎的,它不停地在Objective-C头文件中为项目中没有直接引用的类。
我打开terminal, cd
进入项目目录,然后运行以下命令来grep -nr ProblemClassName.h .
包含类头文件的所有文件: grep -nr ProblemClassName.h .
事实certificate,桥头包括一个甚至没有在项目导航器中引用过时的文件。 这又导入了Xcode错误中引用的头文件,这些文件也没有包含在Xcode项目导航器中。 现在我知道不仅仅依靠Xcode项目导航器来查看错误引用的文件。
tl; dr仔细检查桥接头,以确保所有在那里导入的文件都应该在那里,而不是导入头文件,然后导入问题头文件。
我发现一个项目有一个子项目,而不是用正确的语法在子项目中引用包含:
#import <SubProject/Filename.h>
它直接导入它们
#import <Filename.h>
这是唯一可能的,因为子项目的path被包含在主项目的“标题searchpath”中 – 这是做生意的错误方式。 所以我从那里删除了它。 子项目应该在“构build阶段 – 复制文件”部分(实际上已经发生)中复制需要包含的文件,并且应该使用使用Subproject / Filename.h语法的正确导入forms。
Fwiw我开始看起来是随机的 – 对我来说,解决的办法是做Product->Clean
,它神奇地消失了。
对于我来说,我忘了在m文件中的接口定义中包含括号。