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?
-
23-09-2019 - |
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.
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];
}