C Objetivo: Dado un identificador de clase, puedo comprobar si esta clase implementa un protocolo determinado? O tiene un cierto selector?
-
23-09-2019 - |
Pregunta
Quiero usar esto para una factoría de objetos: Dada una cadena, cree una clase, y si esta clase soporta un protocolo (con un método Create ()) entonces Alloc la clase y llamada Crear.
Solución
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
[[klass alloc] create];
}
Me mayo, sin embargo, señalar cuántos horrible Objective-C que gobierna está rompiendo por hacer lo anterior? Por ejemplo, nunca debe estar llamando a métodos en una instancia asignado-pero-no-inicializado. El Xcode analizador estático le dará todo tipo de advertencias acerca de las pérdidas de memoria.
Una mejor opción sería la siguiente:
[[[klass alloc] init] create];
Pero parece dar a entender que usted no desea llamar init.
Se podría considerar un método de clase: [klass create]
, que devolvería una instancia no propiedad de klass
. Entonces usted acaba de comprobar [klass respondsToSelector:@selector(create)]
antes de llamar a él.
Otros consejos
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}