我正在帮助一个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方法和枚举。
答案 0 :(得分:27)
最好的预防和治疗方法是遵循一些关于何时从头文件导入的指导原则。作为一般规则,除非在这些情况下,否则永远不要从Objective-C标头导入:
@class
或@protocol
向前声明它们,例如@class ClassFromOtherHeader;
每个其他#import
都应该在您的实施中。我的建议是根据这些规则开始将所有#import
语句从标题中移出到实现文件中。从您认为是问题根源的文件开始,然后向外移动。这将解决您的问题,并为您提供更清晰的代码和更快的构建时间的附带好处。
答案 1 :(得分:20)
对我来说,上述答案都没有帮助,here给出的答案也没有成功。
为我修复的是关闭Xcode,转到〜/ Library / Developer / Xcode / DerivedData并删除与该项目相关的所有派生数据。之后我重新打开了这个项目并且工作正常。
希望能帮助别人!
答案 2 :(得分:3)
就我而言,所提到的解决方案都没有解决问题。 Xcode报告了我在Swift中重写的类的重复接口。不知何故,它继续在Objective-C头文件中提取一个没有在项目中直接引用的类。
我将终端cd
打开到项目目录中,然后运行以下内容以跟踪包含类标题的所有文件:
grep -nr ProblemClassName.h .
事实证明,桥接标题包含一个过时的文件,甚至在项目导航器中都没有引用。这反过来导入了Xcode错误中引用的头文件,这些头文件也没有包含在Xcode项目导航器中。现在我知道不仅仅依赖Xcode项目导航器来处理错误引用的文件。
tl; dr 仔细检查桥接标头,确保其中导入的所有文件都应该存在,并且不会导入导入问题标题的标头。
答案 3 :(得分:1)
我发现项目有一个子项目,而不是用正确的语法引用子项目中的包含:
#import <SubProject/Filename.h>
直接导入它们
#import <Filename.h>
这是唯一可能的,因为子项目的路径包含在&#34;标题搜索路径中。主要项目 - 这是做生意的错误方式。所以我从那里删除了它。 子项目应该在其构建阶段复制所需的包含文件 - 复制文件&#34;部分(实际上已经发生),应该使用使用Subproject / Filename.h语法的正确导入形式。
答案 4 :(得分:0)
Fwiw我开始随意看到这个 - 对我而言,修复就是做Product->Clean
而且它神奇地消失了。
答案 5 :(得分:0)
对我来说,我忘了在m文件中的接口定义中包含括号。