67 votes

Méthode de classe équivalente de -respondsToSelector:

Existe-t-il une méthode de classe équivalente à -respondsToSelector: ?

Quelque chose comme +respondsToSelector: ?

La raison pour laquelle je pose cette question est qu’en implémentant -respondsToSelector: au niveau de la classe, un avertissement du compilateur s’affiche: "found '-respondsToSelector:' au lieu de '+ respondsToSelector:' dans le (s) protocole (s)".

Le code ressemble à ceci:

 Class <SomeProtocol> someClass = [someInstance class];

if ([someClass respondsToSelector:@selector(someSelector:)]) {
    someVar = [someClass someSelector:someData];
}
 

82voto

BJ Homer Points 29168

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.

9voto

newacct Points 42530

Une méthode de classe est juste une méthode de l’objet de classe, vous devriez donc pouvoir le faire.

 [MyClass respondsToSelector:@selector(...)]
 

5voto

Hugo Scott-Slade Points 276

Vous pouvez utiliser les instancesRespondToSelector: depuis iOS 2.0, alors vous pouvez faire où avec une instance de classe;

 [myInstance respondsToSelector: @selector(...)];
 

Avec une classe, vous pouvez utiliser

 [myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];
 

Qui se comportera comme +(BOOL) respondsToSelector

2voto

escouten Points 560

Ce que je pense vous demandez: Pouvez-vous demander à une classe si elle répond à l' +someMethod ou pas? En d'autres termes, la pensée de l'Api Cocoa Touch, vous souhaitez:

[ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO
[ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES

Mais ce que j'ai écrit ci-dessus ne fonctionne pas comme souhaité. respondsToSelector: seulement sur les méthodes d'instance. (Ainsi, les deux appels reviendra PAS.) Dans le Cacao Api n'est pas l'équivalent d' respondsToSelector: d'une classe.

Vous pouvez, toutefois, appelez - class_getClassMethod. Si le résultat est non-NULLE, la méthode de la classe que vous posez sur est présent et vous pouvez l'appeler.

0voto

SK9 Points 9683

En Objective C, les classes sont également des objets, ce qui vous permet d’envoyer des messages. En particulier, vous pouvez demander -respondsToSelector: d'une classe. Cependant, vous ne pouvez pas envoyer de méthodes de niveau classe à des objets non-classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X