2015-04-22 23 views
7

如何在運行時發現類是否覆蓋其超類的方法?找出Objective-C類是否覆蓋方法

例如,我想了解一個類是否自己實現了isEqual:hash,而不是依賴於超類。

+0

請說明。你在說什麼在文檔中查找什麼?某種運行時檢查?什麼? – rmaddy

+0

@rmaddy他明確要求檢查一個子類是否包含在其超類中聲明的方法的自定義實現。問題還包含objective-c運行時標籤。 –

+0

@DominikHadl是的,這正是我想要的。我想在運行時做到這一點。假設我沒有上述課程的文檔。 – cfischer

回答

4

你只需要獲得的方法列表,尋找您想要的:

#import <objc/runtime.h> 

BOOL hasMethod(Class cls, SEL sel) { 
    unsigned int methodCount; 
    Method *methods = class_copyMethodList(cls, &methodCount); 

    BOOL result = NO; 
    for (unsigned int i = 0; i < methodCount; ++i) { 
     if (method_getName(methods[i]) == sel) { 
      result = YES; 
      break; 
     } 
    } 

    free(methods); 
    return result; 
} 

class_copyMethodList只返回被直接定義在有問題的類,而不是超方法,使應是你的意思。

如果您需要分類方法,請使用class_copyMethodList(object_getClass(cls), &count)

+0

非常好,非常感謝! – cfischer