C Objetivo: Dado un identificador de clase, puedo comprobar si esta clase implementa un protocolo determinado? O tiene un cierto selector?

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

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.

¿Fue útil?

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];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top