7

我正在开发一个最初在 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。

4

3 回答 3

28

我遇到了同样烦人的问题,结果发现我不小心在我的一个 VC 代码中包含了该类别的 .m 文件而不是 .h 文件。将其更正为 .h 文件删除了链接器警告。

于 2012-11-24T00:27:07.383 回答
4

不要忽略警告。

Apple 的“使用 Objective-C 编程”指南在“自定义现有类”部分中说:

如果在一个类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至是超类)上的另一个类别中的方法相同,则对于在哪个方法实现中使用的行为是不确定的运行。

如果它一直为你工作,那么它是幸运的。

于 2012-11-14T23:27:21.083 回答
0

我也有这个问题,但又是由不同的东西引起的。对我来说,这个类别已经被添加到 Xcode 项目中两次了!直到我去重命名其中一个方法并在重构预览中看到它两次列出了类别文件时,我才发现是这种情况。

于 2014-04-30T21:55:35.767 回答