objective-c cocoa objective-c-runtime

objective c - Convierta una cadena("MyExampleClass") en un nombre de clase(MyExampleClass)



objective-c cocoa (4)

Desea NSClassFromString :

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

También puede usar 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.

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

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

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


Esto es lo que querrías:

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

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


Si intenta 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.


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

usa este, esto te dará lo que quieras.