39 votes

Objectif C: Étant donné un identifiant de classe, puis-je vérifier si cette classe implémente un protocole donné? Ou a un certain sélecteur?

Je souhaite utiliser ceci pour une fabrique d'objets: avec une chaîne, créez une classe et, si cette classe prend en charge un protocole (avec une méthode Create ()), allouez la classe et appelez Create.

269voto

Chuck Points 138930
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}

15voto

BJ Homer Points 29168
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

Puissé-je, en revanche, combien terrible Objective-C règles vous êtes à la rupture en procédant comme ci-dessus? Par exemple, vous ne devriez jamais appeler des méthodes sur un alloués-mais-pas-initialisé instance. Xcode Analyseur Statique qui va vous donner toutes sortes de mises en garde sur les fuites de mémoire.

Une meilleure option serait celle-ci:

[[[klass alloc] init] create];

Mais vous semblez insinuer que vous ne souhaitez pas appeler init.

Vous pourriez envisager une méthode de classe: [klass create], qui permettrait le retour d'une non-propriété de l'instance d' klass. Vous devez alors il suffit de cocher [klass respondsToSelector:@selector(create)] avant de l'appeler.

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