Antworten:
Es gibt auch den statischen NachrichteninstanzenRespondToSelector : (SEL) -Selektor Sie würden ihn so nennen:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
oder so:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Dies kann nützlich sein, wenn Sie abhängig davon einen oder einen anderen Konstruktor aufrufen möchten (ich meine, bevor Sie die Instanz selbst haben).
Verwenden Sie respondsToSelector:
. Aus der Dokumentation :
replyToSelector:
Gibt einen booleschen Wert zurück, der angibt, ob der Empfänger eine Methode implementiert oder erbt, die auf eine bestimmte Nachricht antworten kann.
- (BOOL)respondsToSelector:(SEL)aSelector
Parameter
aSelector - Ein Selektor, der eine Nachricht identifiziert.Rückgabewert,
YES
wenn der Empfänger eine Methode implementiert oder erbt , die andernfalls auf aSelector reagieren kannNO
.
Sie suchen nach AntwortenToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Wie Donal sagt, sagt Ihnen das Obige, dass foo definitiv mit dem Empfang des Balkenwählers umgehen kann . Wenn foo jedoch ein Proxy ist, der Balken an ein zugrunde liegendes Objekt weiterleitet, das die Balkennachricht empfängt, antwortetToSelector: NEIN, obwohl die Nachricht an ein Objekt weitergeleitet wird, das auf Balken antwortet.
Das Überprüfen von Selektoren mit responsondsToSelector gilt normalerweise nur für Delegatmethoden. Sie sollten nicht forwardInvocation oder Proxys für Delegatmethoden verwenden. Wenn Sie respondsToSelector in anderen Situationen verwenden müssen, möchten Sie möglicherweise sicherstellen, dass es keine geeignetere Methode zum Entwerfen Ihres Programms gibt.
- forwardInvocation:
).