2010-02-26 4 views

Respuesta

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

Puedo, sin embargo, señalar cuántas reglas horrible Objective-C que está rompiendo por hacer lo anterior? Por ejemplo, nunca debe llamar a métodos en una instancia asignada pero no inicializada. El Xcode Static Analyzer le dará todo tipo de advertencias sobre fugas de memoria.

Una mejor opción sería la siguiente:

[[[klass alloc] init] create]; 

Pero parecería implicar que usted no desea llamar init.

Podría considerar un método de clase: [klass create], que devolvería una instancia no propia de klass. Luego, solo debe marcar [klass respondsToSelector:@selector(create)] antes de llamarlo.

+1

Gracias. Tienes razón, el método Create debería ser un método de clase. Creo que esta es la forma en que se diseñan las fábricas de objetos. – Jacko

+1

Esta no es la mejor respuesta. Chuck es mejor. – rafaperez

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

Cool. Gracias por el consejo. – Jacko

+66

¿Cómo no está marcado como respuesta? – Sam

+7

Hizo dos preguntas en su título :) – ctpenrose

Cuestiones relacionadas