Update nach dem Bearbeiten:
respondsToSelector:
Wie Sie wahrscheinlich wissen, reagiert ein Klassenobjekt einwandfrei . In einer Testanwendung kann ich beide der folgenden Aktionen ohne Compiler-Warnungen ausführen:
NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);
Sie haben jedoch ein Protokoll für Ihre Variable deklariert, sodass davon ausgegangen wird, dass das Klassenobjekt, auf das Sie zeigen, diese Methoden implementiert. Die einfachste Lösung wäre, someClass
als id
zum Zweck des Anrufs zu besetzen respondsToSelector:
. Eine etwas sauberere Lösung wäre, Ihre eigene zu @protocol
deklarieren +respondsToSelector:(SEL)selector
, die deklariert , und dann someClass
wie folgt zu deklarieren :
Class<SomeProtocol, ClassRespondingToSelector> someClass = ...
Stellen Sie schließlich sicher, dass Sie einen Fehler bei Apple unter http://bugreporter.apple.com melden . Fügen Sie eine einfache Testanwendung hinzu, damit klar ist, was Sie tun. Sie begrüßen solche Fehlerberichte, auch wenn sie in der Vergangenheit eingereicht wurden, da dies ihnen hilft, die Korrekturen zu priorisieren.
Schlussbemerkung: Dies geschieht wahrscheinlich, weil Sie theoretisch ein von NSObject völlig getrenntes Stammobjekt implementieren könnten und in diesem Fall nicht darauf reagieren würden-respondsToSelector:
. -[NSObject respondsToSelector:]
wird tatsächlich im NSObject
Protokoll deklariert , nicht in der Klassendefinition. Das NSObject
Protokoll ist tatsächlich der Ort, an dem das meiste, was Sie als NSObject
tatsächlich kennen, lebt. Man könnte argumentieren, dass +respondsToSelector:
das auch drin sein sollte, aber ab sofort ist es nicht mehr so. Und da Sie eine Protokollliste bereitgestellt haben und die Methode nicht vorhanden ist, erhalten Sie eine Warnung, um sicherzustellen, dass Sie wissen, was Sie tun.
Class
reagiert nicht aufrespondsToSelector:
.id classObject = [SomeClass class]; [classObject respondsToSelector:]
respondToSelector
in der nicht findenClass
.Nun, eine Klassenmethode ist nur eine Methode des Klassenobjekts, daher sollten Sie dies einfach tun können
[MyClass respondsToSelector:@selector(...)]
quelle
Class
oderid
ohne weitere Qualifizierung dieses Typs (mit einem Protokoll) senden , geht der Compiler davon aus, dass Sie selbst eine Art Antwort auf Selektor oder eine Art Klassenprüfung durchführen. Wenn Sie jedoch ein Protokoll oder (zum Beispiel) eine bestimmte Klasse angeben, wird es hilfreich und führt die Prüfung für Sie durch. Da das Protokoll, mit dem Sie die Variable deklariert haben, keine+respondsToSelector:
Deklaration enthält, gibt der Compiler eine Warnung aus.instancesRespondToSelector:
Seit iOS 2.0 können Sie Folgendes verwenden: Wo können Sie also mit einer Instanz einer Klasse arbeiten ?[myInstance respondsToSelector: @selector(...)];
Mit einer Klasse können Sie verwenden
[myClass instanceRespondsToSelector: @selector(...)]; // or [[myInstance class] instanceRespondsToSelector: @selector(...)];
Welches wird sich so verhalten
+(BOOL) respondsToSelector
quelle
Ich denke, Sie haben gefragt: Können Sie eine Klasse fragen, ob sie darauf reagiert
+someMethod
oder nicht? Mit anderen Worten, wenn Sie an die Cocoa Touch-APIs denken, möchten Sie:[ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO [ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES
Aber was ich oben geschrieben habe, funktioniert nicht wie gewünscht.
respondsToSelector:
geht es nur um Instanzmethoden. (Somit geben beide Aufrufe NO zurück.) Innerhalb der Cocoa-APIs gibt es kein ÄquivalentrespondsToSelector:
für eine Klasse.Sie können jedoch anrufen
class_getClassMethod
. Wenn das Ergebnis nicht-NULL ist, die Klassenmethode Sie fragen ist vorhanden und man kann es nennen.quelle
respondsToSelector:
funktioniert gut mitClass
Objekten, um die Existenz von Klassenmethoden zu melden.class_getClassMethod
Ansatz tatsächlich richtig lag . Wenn ich genug Geduld gehabt hätte, um den gesamten Thread zu lesen, müsste ich nicht dieselbe Lösung neu erfinden.+instancesRespondToSelector:
.-respondsToSelector:
auf einem Klassenobjekt funktioniert ganz anders.In Ziel C sind Klassen auch Objekte, sodass Sie die Objektnachrichten senden können. Insbesondere können Sie
-respondsToSelector:
von einer Klasse verlangen . Sie können jedoch keine Methoden auf Klassenebene an Objekte senden, die keine Klassen sind.quelle