2015-04-22 30 views
7

Come posso scoprire, in fase di esecuzione, se una classe sostituisce un metodo della sua superclasse?Scopri se una classe Objective-C sovrascrive un metodo

Ad esempio, voglio scoprire se una classe ha la propria implementazione di isEqual: o hash, invece di fare affidamento su una super classe.

+0

Si prega di chiarire. Stai parlando di cercare qualcosa nella documentazione? Una sorta di controllo di runtime? Che cosa? – rmaddy

+0

@rmaddy Sta chiedendo chiaramente se verificare se una sottoclasse contiene un'implementazione personalizzata di un metodo dichiarato nella sua superclasse. E la domanda contiene anche il tag runtime oggettivo. –

+0

@DominikHadl Sì, è esattamente quello che voglio. Voglio farlo in runtime. Supponiamo che non disponga di documentazione per la suddetta classe. – cfischer

risposta

4

Hai solo bisogno di ottenere un elenco dei metodi e cercare quello che si desidera:

#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 restituisce solo i metodi che sono definiti direttamente sulla classe in questione, non superclassi, in modo che dovrebbe sii cosa intendi

Se sono necessari metodi di classe, utilizzare class_copyMethodList(object_getClass(cls), &count).

+0

Eccellente, grazie mille! – cfischer