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.