您可以随时访问类超类,所以你可以将它传递给class_getInstanceMethod
或class_getMethodImplementation
使用相同的SEL
并比较IMP
地址以查看子类是否覆盖该方法。
如果您想要获取定义此方法的根类,这会变得更加有趣。
无论如何,这里有云:
static inline BOOL isInstanceMethodOverridden(Class cls, SEL selector, Class *rootImpClass) {
IMP selfMethod = class_getMethodImplementation(cls, selector);
BOOL overridden = NO;
Class superclass = [cls superclass];
while(superclass && [superclass superclass]) {
IMP superMethod = class_getMethodImplementation(superclass, selector);
if(superMethod && superMethod != selfMethod) {
overridden = YES;
if(!rootImpClass) {
//No need to continue walking hierarchy
break;
}
}
if(!superMethod && [cls respondsToSelector:selector])) {
//We're at the root class for this method
if(rootImpClass) *rootImpClass = cls;
break;
}
cls = superclass;
superclass = [cls superclass];
}
return overridden;
}
这是真棒 – 2013-04-09 19:49:55
这将对于不继承'NSObject'对象,如'NSProxy'失败。只是一个笔记。 – 2013-05-07 22:58:55
@ RichardJ.RossIII查看更新。 :) – 2013-07-18 21:19:44