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

StackOverflow https://stackoverflow.com/questions/2344672

Question

Je veux l'utiliser pour une usine d'objet: d'une chaîne, créez une classe, et si cette classe prend en charge un protocole (avec une méthode Create ()) alloc puis la classe et appel Créer.

Était-ce utile?

La solution

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

Puis-je cependant souligner combien de règles Objective-C terrible que vous enfreignez en faisant ce qui précède? Par exemple, vous ne devriez jamais appeler des méthodes sur une instance allouée mais non-initialisées. L'analyseur statique Xcode vous donnera toutes sortes d'avertissements sur les fuites de mémoire.

serait une meilleure option ceci:

[[[klass alloc] init] create];

Mais vous semblez dire que vous ne voulez pas appeler initialisation.

Vous pourriez envisager une méthode de classe: [klass create], qui renvoie une instance non-propriété exclusive de klass. Ensuite, vous devriez juste vérifier [klass respondsToSelector:@selector(create)] avant de l'appeler.

Autres conseils

NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top