我正在开发一个最初在 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 自动生成的,然后这些类中的每一个都有一个 Category 扩展它以实现某些方法。我举个例子...
我们有一个名为 LisaObject 的基类,它继承自 NSManagedObject,它有一个名为 LisaObject+extras 的类别。在 LisaObject+extras 中,有一个名为“values”的方法,它返回一个 NSMutableDictionary。
然后我们有一个继承自 LisaObject 的名为 HistoryObject 的类。HistoryObject 还有一个名为 HistroyObject+extras 的类别。此类别还有一个名为“值”的方法。在 HistoryObject+extras values 方法中,它调用 [super values],然后检查一些条件并在字典中设置一些在基类方法中没有设置的附加值。
然后,我们有一个名为 LessonStatusObject 的类,它继承自 HistoryObject,它也有一个名为 LessonStatusObject+extras 的类别,它有一个名为 values 的方法。这个 values 方法也调用 [super 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。