Convierte una cadena ("MyExampleClass") en un nombre de clase (MyExampleClass)


Quiero convertir una cadena a 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 la clase de la cadena. Quiero hacer algo como lo siguiente. (Considere el código como un boceto.)

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

¿Cuál es la manera correcta de hacer esto?

Author: Josh Caswell, 2011-01-11

4 answers

Esto es lo que querrías:

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

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

 76
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 05:44:10

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 (p. ej. objc_getClass(const char* name), objc_lookUpClass(const char* name)). El primero no cargará una clase. Este último lo hará. Esa opción podría ser algo bueno en algunos casos.

 23
Author: justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-26 00:26:38
id a = [[NSClassFromString(@"MyExampleClass") alloc] init];

Usa este esto te dará lo que quieres.

 6
Author: Ishu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 05:46:18

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

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

Echa un vistazo al libro "Design Patterns: Elements of Reusable Object-Oriented Software" de Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides.

 1
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-30 02:03:02