在类别中重写并在子类中再次重写的方法的调用优先级

Call precedence for method overridden in category and again in subclass

我在 Objective-C 从事一个项目,我遇到了一个情况。

假设我有一个名为 Foo 的 class。我为此 class 实现了一个名为 Foo+Bar 的类别并覆盖了 Foo 的方法 fooMethod:.

然后我为 Foo 创建一个名为 Baz 的子 class,并在 class.

中覆盖相同的 fooMethod:
  1. 当我在 Baz 对象上使用方法 fooMethod: 时, 实施将被调用? Foo+Bar 或 里面一个 Baz?
  2. Objective-C 如何处理这种情况,为什么?

我愿意接受任何好的解释 and/or 文档。

如果您重写类别中的方法,行为是明确的 undefined。所以请不要:

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.

如果您要覆盖在超类的类别中定义 一次 的方法,那么当然会调用子类实现。

但是在这里你覆盖了一个在超类中定义了两次的方法。行为很可能是未定义的,因为您覆盖了未定义的实现。即使这行得通,也无论如何都是糟糕的代码。

真的,请不要这样做。

对您的示例进行了简单测试,结果表明类别的实现在 Buz class 实例上被调用,即使我没有在任何地方包含 header Foo+Bar,我使用了 iPhone 6 模拟器 iOS 8.1。 Apple 表示行为是不可预测的,因此进行此类编码是一种不好的做法。

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.

参见,https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html 部分避免类别方法名称冲突