Respuestas:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
corre el riesgo de escribir mal el nombre de la clase o de usar una clase que no existe. No lo sabrá hasta el tiempo de ejecución si comete ese error. En cambio, si usa el tipo de objetivo-c incorporado Class
para crear una variable, el compilador verificará que la clase existe.
Por ejemplo, en su .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.
Si está trabajando con Objective-C sin el NeXTstep
( OS X
, iOS
, GNUstep
etc.) o el sistema que acaba de pensar que este método es más limpio, entonces se podría utilizar la API de biblioteca de tiempo de ejecución de 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 ];
Bajo Objective-C (1.0 o versión 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 1.0
versión, sin embargo, he usado la 2.0
función en el código que ahora está en producción. Personalmente, creo que utilizar la 2.0
función es más limpio 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 versus the sum of two pointers (isa, cstring)
, a size_t length (cstring_length)
, y length of the string in bytes + 1
para la NeXTSTEP
API.