在类别中重写并在子类中再次重写的方法的调用优先级
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:
- 当我在
Baz
对象上使用方法 fooMethod:
时,
实施将被调用? Foo+Bar
或
里面一个 Baz
?
- 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.
我在 Objective-C 从事一个项目,我遇到了一个情况。
假设我有一个名为 Foo
的 class。我为此 class 实现了一个名为 Foo+Bar
的类别并覆盖了 Foo
的方法 fooMethod:
.
然后我为 Foo
创建一个名为 Baz
的子 class,并在 class.
fooMethod:
- 当我在
Baz
对象上使用方法fooMethod:
时, 实施将被调用?Foo+Bar
或 里面一个Baz
? - 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.