您可以隨時訪問類超類,所以你可以將它傳遞給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