这很容易测试:
if (method_getImplementation(class_getInstanceMethod(A, @selector(methodRed))) ==
method_getImplementation(class_getInstanceMethod(B, @selector(methodRed))))
{
// B does not override
}
else
{
// B overrides
}
我确实想知道知道 B 是否覆盖 A 上的方法是有帮助的,但是如果您想知道,这就是您找到的方法。
还可能值得注意:在最严格的术语中,上面的代码确定 B 上选择器的实现是否与 A 上选择器的实现不同。如果您有像 A > X > B 这样的层次结构,并且 X 覆盖了选择器,这仍然会报告 A 和 B 之间的不同实现,即使 B 不是覆盖类。如果您想具体了解“B 是否覆盖此选择器(不管其他任何内容)”,您会想要这样做:
if (method_getImplementation(class_getInstanceMethod(B, @selector(methodRed))) ==
method_getImplementation(class_getInstanceMethod(class_getSuperclass(B), @selector(methodRed))))
{
// B does not override
}
else
{
// B overrides
}
很明显,这提出了一个问题“B 选择器的实现是否与其超类不同”,这就是您所要求的(也许更具体地说)。