¿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 el objetivo-c, pero parece que lo sería,
objective-c
reflection
marca
fuente
fuente
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 incorporadoClass
para crear una variable, el compilador verificará que la clase existe.Por ejemplo, en su
.h
:y luego en tu
.m
: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.
fuente
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 . BajoObjective-C 2.0
:Bajo Objective-C (1.0 o versión sin nombre) utilizaría lo siguiente:
No he probado la
1.0
versión, sin embargo, he usado la2.0
función en el código que ahora está en producción. Personalmente, creo que utilizar la2.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 versusthe sum of two pointers (isa, cstring)
, asize_t length (cstring_length)
, ylength of the string in bytes + 1
para laNeXTSTEP
API.fuente
Entonces para usarlo:
fuente