2015-04-22 7 views
7

Wie kann ich zur Laufzeit herausfinden, ob eine Klasse eine Methode ihrer Superklasse überschreibt?Finden Sie heraus, ob eine Objective-C-Klasse eine Methode überschreibt

Zum Beispiel möchte ich herausfinden, ob eine Klasse eine eigene Implementierung von isEqual: oder hash hat, anstatt sich auf eine Superklasse zu verlassen.

+0

Bitte klären. Sprechen Sie darüber, etwas in der Dokumentation nachzuschlagen? Eine Art Laufzeitcheck? Was? – rmaddy

+0

@rmaddy Er fragt eindeutig nach, ob eine Unterklasse eine benutzerdefinierte Implementierung einer in ihrer Oberklasse deklarierten Methode enthält. Und die Frage enthält auch das Ziel-c-Laufzeit-Tag. –

+0

@DominikHadl Ja, genau das möchte ich. Ich möchte dies in Runtime tun. Angenommen, ich habe keine Dokumentation für diese Klasse. – cfischer

Antwort

4

Sie müssen nur eine Liste der Methoden zu bekommen, und sucht die, die Sie wollen:

#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 nur gibt Methoden, die direkt auf die betreffende Klasse definiert sind, nicht übergeordneten Klassen, so dass sollte Sei was du meinst.

Wenn Sie Klassenmethoden benötigen, verwenden Sie class_copyMethodList(object_getClass(cls), &count).

+0

Ausgezeichnet, vielen Dank! – cfischer

Verwandte Themen