我已将方法foo
添加到与类的原始定义分开的类别MYCustomClass
中的类Category1
。然后我在另一个类别foo
中添加了另一个名为Category2
的方法。然后,我在foo
的实例上调用MYCustomClass
。就我而言,正在调用foo
中的Category2
。我的问题是:这有什么解释吗?或者,它是那些“未定义”/“编译器依赖”行为之一。此外,是否可以通过指定我想在呼叫中使用的类别来限定方法调用来处理这种情况。
答案 0 :(得分:3)
这是未定义的行为。来自Objective-C Programming Language文件:
类别无法可靠地覆盖在同一类的另一个类别中声明的方法。
这个问题特别重要,因为许多Cocoa类都是使用类别实现的。您尝试覆盖的框架定义方法本身可能已在类别中实现,因此未定义优先级高的实现。
不,您不能指定foo
的{{1}}或Category1
的{{1}}。如果您需要这个,您应该为这些方法指定不同的名称,例如: foo
和Category2
。
答案 1 :(得分:3)
当加载一个类别时,它的方法被插入到现有的方法表中,并且一旦完成它就无法区分它们来自何处。最后一个要加载的类别。回到NeXTSTEP时代,我们有时会故意这样做,以便在我们没有源代码的代码中修复损坏的方法。