2011-01-11 12 views
29

Quiero convertir una cadena en un nombre de clase. Imagine que tengo una cadena, que cambia, que contiene un nombre de clase, por ejemplo, la cadena "MyExampleClass". Ahora, quiero crear un objeto de la clase MyExampleClass. Tengo que obtener el nombre de clase de la cadena. Quiero hacer algo como lo siguiente. (Considere el código como un boceto.)Convertir una cadena ("MyExampleClass") en un nombre de clase (MyExampleClass)

NSString *classNameStr = "MyExampleClass"; 
id theClass = [UIClass classFromString:classNameStr]; 
theClass *myObject = [[theClass alloc] init]; 

¿Cuál es la forma correcta de hacerlo?

+0

¿has leído el tutorial de Java sobre la reflexión? – atk

+0

@atk: ¿El iOS no tiene una sintaxis diferente? – EmptyStack

+0

Disculpas. Creí haber visto "java" en las etiquetas. Estaba equivocado :) – atk

Respuesta

76

Esto es lo que te gustaría:

Class theClass = NSClassFromString(classNameStr); 
id myObject = [[theClass alloc] init]; 

Tenga en cuenta que no se puede utilizar theClass como un nombre de tipo (es decir theClass *myObject). Tendrás que usar id para eso.

23

¿Quieres NSClassFromString:

NSString *classNameStr = @"MyExampleClass"; 
Class theClass = NSClassFromString(classNameStr); 
id myObject = [[theClass alloc] init]; 

También puede utilizar las interfaces de tiempo de ejecución ObjC (por ejemplo objc_getClass(const char* name), objc_lookUpClass(const char* name)). El primero no cargará una clase. El último lo hará. Esa opción podría ser algo bueno en algunos casos.

6
id a = [[NSClassFromString(@"MyExampleClass") alloc] init]; 

utilizar este le dará lo que quiere.

0

Si está tratando de construir sus clases dinámicamente, le recomiendo que eche un vistazo al patrón de diseño de método de fábrica, de lo contrario perderá la pista de quién crea qué y cómo.

Para hacerlo, puede codificar una clase que recibe una cadena y devuelve una clase dependiendo de la cadena de entrada.

Eche un vistazo al libro "Patrones de diseño: elementos del software reutilizable orientado a objetos" por Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides.

Cuestiones relacionadas