に直接アクセスすることはできません。同じSEL
を持つclass_getInstanceMethod
またはclass_getMethodImplementation
に渡して、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;
}
このようなNSProxy' ''などNSObject'のサブクラスを作成していないオブジェクト、失敗します –
この素晴らしいです。ただのメモ。 –
@ RichardJ.RossIII更新された参照してください。 :) –