XCode 4.5警告父类/子类的类别之间的方法名称冲突

Jim*_*Jim 7 xcode objective-c categories ios xcode4.5

我正在开发一个最初在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
Run Code Online (Sandbox Code Playgroud)

这些警告从未出现在以前版本的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.

Sco*_*oop 28

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

  • 这也发生在我身上.我建议其他任何看到这个的人在整个项目中搜索字符串'.m''. (6认同)

Chr*_*die 4

不要忽略该警告。

Apple 的“Programming With Objective-C”指南在“自定义现有类”部分中说:

如果类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至超类)的另一个类别中的方法相同,则该行为未定义使用哪个方法实现运行。

如果它对你有用,那就很幸运了。