Mise à jour après avoir vu ton edit:
Un objet de classe répond à l' respondsToSelector:
très bien, comme vous le savez probablement. Dans une application de test, je peux faire les deux opérations suivantes sans les avertissements du compilateur:
NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);
Toutefois, vous avez déclaré un protocole sur votre variable, de sorte qu'il suppose que la classe de l'objet que vous êtes pointant à implémente ces méthodes. La solution la plus simple serait de jeter someClass
comme id
pour les fins de l'appel d' respondsToSelector:
. Un peu plus propre solution serait de déclarer votre propre @protocol
qui déclare +respondsToSelector:(SEL)selector
, puis déclarer someClass
comme suit:
Class<SomeProtocol, ClassRespondingToSelector> someClass = ...
Enfin, assurez-vous de déposer un bug avec Apple à l' http://bugreporter.apple.com. Inclure un simple test de l'application, de sorte qu'il est très clair ce que vous faites. Ils se félicitent de ce genre de rapports de bug, même s'ils ont été soumis dans le passé, car il permet de prioriser les correctifs.
Note finale: c'est probablement dû au fait que, en théorie, on pourrait avoir choisi de mettre en œuvre un objet racine tout à fait distincte de NSObject, et dans ce cas, il ne serait pas répondre à l' -respondsToSelector:
. -[NSObject respondsToSelector:]
est effectivement déclaré dans l' NSObject
de protocole, pas de la définition de classe. L' NSObject
protocole est effectivement là où la plupart de ce que vous savez en tant que NSObject
vit. On pourrait avancer que, +respondsToSelector:
devrait également être là, mais comme de maintenant, il n'est pas. Et puisque vous avons fourni une liste de protocole, et la méthode n'est pas là, il vous donne un avertissement assurez-vous que vous savez ce que vous faites.