类别冲突:来自一个类别的实例方法与另一个类别相同的方法冲突。

20

我所知道的有两种情况会导致以下错误:

ld: warning: instance method 'resetAudioSystem' in category from /opentok-ios-sdk/Opentok.framework/Opentok(OTPublisher+AudioSnoop.o) conflicts with same method from another category
ld: warning: instance method 'attachAudioSnoopBlock:' in category from /opentok-ios-sdk/Opentok.framework/Opentok(OTPublisher+AudioSnoop.o) conflicts with same method from another category
ld: warning: instance method 'setVideoSnoopDelegate:' in category from /opentok-ios-sdk/Opentok.framework/Opentok(OTPublisher+VideoSnoop.o) conflicts with same method from another category

可能性1: 类别实例方法被声明了两次。(在此描述:SO

但是,当我搜索任何3个实例方法(在Xcode或Grep中),我没有发现它被声明两次。

可能性2: 意外导入.m文件。(在此描述:SO

但是,我检查了所有的导入,整个项目只导入了一次框架。而且,在Build Phases中也只显示一次。

我的程序在不崩溃的情况下运行,这可能是因为最后添加的类别定义被使用,而且恰好是正确的。(来源

问题1: 在添加之前有没有办法知道这两个类别所在的位置?

问题2: 关于如何解决这个问题,还有其他的想法吗?

注意:Opentok Framework是一个二进制文件

出现在:

xcode 4.6和xcode 5

iOS6和iOS7


检查您的搜索路径。构建设置>搜索路径。我过去也遇到过类似的问题,大多数情况下都是由于搜索路径引起的。 - sbarow
选择的答案正确吗?在我看来,赞同票最高的似乎是正确的。 - Benjohn
4个回答

41

我看到这个警告是因为我错误地导入了一个类别的实现文件而不是它的头文件。所以:

错误的方式:#import 'MyClass+MyCategory.m'

正确的方式:#import 'MyClass+MyCategory.h'


6
我遇到了这个错误,因为我直接将方法的实现粘贴到了头文件(*.h)中。尽管它能正常工作,但唯一的症状是警告。
请检查你的实现是否在正确的(*.m)文件中。

4

这似乎是一个连接器错误。可能SDK被链接了多次,或者-ObjC缺失/存在于不应该的地方。检查连接器标志。尝试删除所有OpenTok框架,在您的项目中确保它不存在,然后重新下载并安装。


0
在我的情况下,包含类别的头文件被一个类导入了两次。这并不明显,因为另一个头文件也导入了相同的头文件。换句话说,
//Class_with_warnings.h:
#import "Offending_Header.h" // import #1
#import "Class_A.h"          // import #2

//Whereas Class_A.h:
#import "Offending_Header.h" // import #2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接