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, someClassals idzum Zweck des Anrufs zu besetzen respondsToSelector:. Eine etwas sauberere Lösung wäre, Ihre eigene zu @protocoldeklarieren +respondsToSelector:(SEL)selector, die deklariert , und dann someClasswie 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 NSObjectProtokoll deklariert , nicht in der Klassendefinition. Das NSObjectProtokoll ist tatsächlich der Ort, an dem das meiste, was Sie als NSObjecttatsä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.