我正在开发一个最初在XCode 4.0中构建的项目,然后迁移到使用XCode 4.2。现在我已经测试了迁移到XCode 4.5,我收到了大量警告,如下所示......
instance method 'values' in category from <pathToTheFile>/HistoryObject+extras.o conflicts with same method from another category
这些警告从未出现在以前版本的XCode中,代码也没有改变。
项目在iOS 4.3中设置为部署目标。
所以,我们从以前的开发人员那里得到了一堆DAO类型,我相信这些类是从CoreData自动生成的,然后这些类中的每一个都有一个类,它扩展它以实现某些方法。我举个例子......
我们有一个名为LisaObject的基类,它继承自NSManagedObject,它有一个名为LisaObject + extras的类。在LisaObject + extras中,有一个名为“values”的方法,它返回一个NSMutableDictionary。
然后我们有一个名为HistoryObject的类,它继承自LisaObject。还有一个名为HistroyObject + extras的HistoryObject类别。此类别还有一个名为“values”的方法。在HistoryObject + extras values方法中,它调用[super values],然后检查某些条件并在字典中设置一些未在基类方法中设置的附加值。
然后我们有一个名为LessonStatusObject的类继承自HistoryObject,它也有一个名为LessonStatusObject + extras的类,它有一个名为values的方法。此值方法还调用[超级值],然后对返回的字典执行一些额外的工作。
对于这些“值”方法中的每一个,我们在编译时得到一个警告,就像上面显示的那样,它表示Category有一个名称冲突的方法。
我对此有几个问题。
首先,这种实施是否会导致任何合法问题,或者这些警告通常是否良性?我试着想一想这个实现如何在运行时引起歧义,但我不知道如何发生这种情况。
第二,我是否应该采取措施来解决这些警告(我并不是说只是让它们停止出现;我的意思是修复原因)?还有其他方法可以解决这个问题吗?
另外,为什么XCode 4.2不会对此发出警告,但XCode 4.5会发出警告?
我是否误解了类别?我的意思是,如果“values”方法实际上是每个类实现的一部分,那么以我们的方式覆盖它们就不会有问题,但编译器似乎只是因为这些是类别而抱怨。这有什么不安全的吗?
非常感谢任何建议。
编辑:仅提供更多信息......当我们使用XCode 4.2时,项目将编译器设置为Apple LLVM Compiler 3.0。现在,当我在XCode 4.5中打开项目时,它将编译器设置为Apple LLVM Compiler 4.1。
答案 0 :(得分:28)
我遇到了同样恼人的问题,结果发现我在我的一个VC代码中意外地包含了该类别的.m文件而不是.h文件。将其更正为.h文件会删除链接器警告。
答案 1 :(得分:4)
不要忽视警告。
Apple的“使用Objective-C编程”指南在“Customizing Existing Classes”部分中说:
如果类别中声明的方法的名称与方法相同 在原始类中,或在另一个类别中的方法相同 class(甚至是超类),行为未定义为哪个 方法实现在运行时使用。
如果它一直在为你工作,那就很幸运。
答案 2 :(得分:0)
我也遇到过这个问题,但又是由不同的东西造成的。对我来说,这个类别已经被添加到Xcode项目两次了!我没有发现这种情况,直到我重命名其中一种方法,并在重构预览中看到它列出了两次类别文件。