una que programacion orientada objetos miembros metodos ejemplos constructores codigo clases clase objective-c reflection

objective c - que - ¿Crear instancia de clase c objetivo por nombre?



programacion orientada a objetos c++ ejemplos (4)

Si está trabajando con Objective-C sin el sistema NeXTstep ( OS X , iOS , GNUstep , etc.) o simplemente piensa que este método es más limpio, entonces podría utilizar la API de la biblioteca de tiempo de ejecución del lenguaje Objective-C . Bajo Objective-C 2.0 :

#import <objc/runtime.h> //Declaration in the above named file id objc_getClass(const char* name); //Usage id c = objc_getClass("Object"); [ [ c alloc ] free ];

En Objective-C (versión 1.0 o sin nombre), utilizaría lo siguiente:

#import <objc/objc-api.h> //Declaration within the above named file Class objc_get_class( const char* name); //Usage Class cls = objc_get_class( "Test" ); id obj = class_create_instance( cls ); [ obj free ];

No he probado la versión 1.0 , sin embargo, he usado la función 2.0 en el código que ahora está en producción. Personalmente creo que la utilización de la función 2.0 es más limpia si está disponible que la función NS ya que consume menos espacio: the length of the name in bytes + 1 ( null terminator ) para la API 2.0 frente a the sum of two pointers (isa, cstring) una size_t length (cstring_length) y la length of the string in bytes + 1 para la API NeXTSTEP .

¿Es posible crear una instancia de una clase por nombre? Algo como:

NSString* className = @"Car"; id* p = [Magic createClassByName:className]; [p turnOnEngine];

No sé si esto es posible en Object-C, pero parece que sería,


NSClassFromString() corre el riesgo de NSClassFromString() el nombre de la clase o, de lo contrario, utilizar una clase que no existe. No descubrirás hasta el tiempo de ejecución si cometes ese error. En cambio, si usa el tipo de Class object-c incorporado para crear una variable, el compilador verificará que la clase existe.

Por ejemplo, en tu .h :

@property Class NameOfClass;

y luego en tu .m :

id object = [[NameOfClass alloc] init];

Si escribió mal el nombre de la clase o si no existe, obtendrá un error en el momento de la compilación. También creo que este es un código más limpio.


@interface Magic : NSObject + (id)createInstanceOfClass:(Class)classe; @end @implementation Magic + (id)createInstanceOfClass:(Class)classe { return [[classe alloc] init]; } @end

Entonces para usarlo:

Car *car = [Magic createInstanceOfClass:[Car class]]; [car engineTurnOn];


id object = [[NSClassFromString(@"NameofClass") alloc] init];