クラスのスーパークラスにはいつでもアクセスできるため、それを一緒に、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;
}