使用类别在Objective C类中添加冲突方法

时间:2011-06-08 11:29:16

标签: objective-c objective-c-category

我已将方法foo添加到与类的原始定义分开的类别MYCustomClass中的类Category1。然后我在另一个类别foo中添加了另一个名为Category2的方法。然后,我在foo的实例上调用MYCustomClass。就我而言,正在调用foo中的Category2。我的问题是:这有什么解释吗?或者,它是那些“未定义”/“编译器依赖”行为之一。此外,是否可以通过指定我想在呼叫中使用的类别来限定方法调用来处理这种情况。

编辑:我知道我所做的事情不受支持。我只是对它周围的黑客感兴趣。

2 个答案:

答案 0 :(得分:3)

这是未定义的行为。来自Objective-C Programming Language文件:

  

类别无法可靠地覆盖在同一类的另一个类别中声明的方法。

     

这个问题特别重要,因为许多Cocoa类都是使用类别实现的。您尝试覆盖的框架定义方法本身可能已在类别中实现,因此未定义优先级高的实现。

不,您不能指定foo的{​​{1}}或Category1的{​​{1}}。如果您需要这个,您应该为这些方法指定不同的名称,例如: fooCategory2

答案 1 :(得分:3)

当加载一个类别时,它的方法被插入到现有的方法表中,并且一旦完成它就无法区分它们来自何处。最后一个要加载的类别。回到NeXTSTEP时代,我们有时会故意这样做,以便在我们没有源代码的代码中修复损坏的方法。