Objective-C的。在类别中重写方法时未定义行为的性质

问题描述 投票:1回答:1

我看了这个:

避免使用类别方法名称冲突

因为在类别中声明的方法被添加到现有类中,所以您需要非常小心方法名称。

如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)上的另一个类别中的方法相同,则关于在哪个方法实现中使用哪个方法实现的行为是未定义的。运行。如果您使用具有自己类的类别,则不太可能成为问题,但在使用类别向标准Cocoa或Cocoa Touch类添加方法时可能会导致问题。

但我很感兴趣为什么会这样。我怀疑这是因为方法调度在Objective-C中是如何工作的,但是我找不到任何可以用类别来解释它的文章。

类别如何修改方法列表?为什么会导致未定义的行为?

objective-c objective-c-runtime objective-c-category
1个回答
2
投票

运行时的源可用。你可以阅读确定的事实。 :)

在抽象术语中,运行时优化调度方法列表的方式随着时间的推移而发生了变化。通过类别覆盖方法一直是粗略的,因为当你这样做时,你实际上“失去”了一个实现。如果丢失的方法在核心类上,它可能具有在类的内部中以稍后加载的方法不应该执行的方式执行的实现细节。

因此,很少有人努力使行为保持一致。特别是如果一致性是成本速度。

© www.soinside.com 2019 - 2024. All rights reserved.