4 Stimmen

Wie kann ich wissen, ob eine Instanz eine Methode in Objective-C implementiert?

Ich würde gerne wissen, ob eine Instanz eine bestimmte Methode implementiert. Ich könnte verwenden respondsToSelector: aber es gibt YES zurück, wenn die Instanz die Methode erbt...

Ich könnte eine Schleife durch die Methoden von class_copyMethodList() aber da ich möglicherweise viele Instanzen überprüfen möchte, wollte ich wissen, ob es eine einfachere Lösung gibt (wie repondsToSelector: aber beschränkt auf die Klasse selbst...)

edit: da ich wirklich glaube, dass es keine Funktion oder Methode gibt, die das tut, habe ich meine geschrieben. Vielen Dank für Ihre Antworten, hier ist die Methode, wenn es von irgendeinem Nutzen sein kann:

+ (BOOL)class:(Class)aClass implementsSelector:(SEL)aSelector
{
    Method          *methods;
    unsigned int    count;
    unsigned int    i;

    methods = class_copyMethodList(aClass, &count);
    BOOL implementsSelector = NO;
    for (i = 0; i < count; i++) {
        if (sel_isEqual(method_getName(methods[i]), aSelector)) {
            implementsSelector = YES;
            break;
        }
    }
    free(methods);
    return implementsSelector;
}

3voto

Ken Punkte 12823

Es ist wahrscheinlich einfacher zu prüfen, ob die Methode, die Ihre eigene Klasse zurückgibt, dieselbe ist oder sich von der Methode unterscheidet, die Ihre Oberklasse zurückgibt.

if ([[obj class] instanceMethodForSelector:sel] != [[obj superclass] instanceMethodForSelector:sel]) {
    NSLog(@"%@ directly implements %@", [obj class], NSStringFromSelector(sel));  
}

3voto

drawnonward Punkte 52834

Instanz antwortet und Super nicht:

-(BOOL) declaresSelector:(SEL)inSelector {
  return [self respondsToSelector:inSelector] && ![super respondsToSelector:inSelector];
}

Instanz reagiert und ist anders als Super:

-(BOOL) implementsSelector:(SEL)inSelector {
  return [self respondsToSelector:inSelector] && !( [super respondsToSelector:inSelector] && [self methodForSelector:inSelector] == [super methodForSelector:inSelector] );
}

Laut den Apple-Dokumenten sollten Sie respondsToSelector vor methodForSelector aufrufen.

1voto

Pablo Santa Cruz Punkte 169147

Sie können verwenden Reflexion um das zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X