2010-11-15 15 views
7

¿Hay alguna forma de importar una clase de una cadena en Objective-C en tiempo de ejecución? Cualquier método que produzca un resultado similar también sería bienvenido.Cargar dinámicamente las clases en Objective-C?

Editar:

deseo tener acceso a una clase cuyo nombre determino en tiempo de ejecución. Así que algo como esto:

NSString *className = getClassName(); 
Class myClass = loadClass(className); 
myClass *myVar = [[myClass alloc] init]; 

¿Hay alguna manera de hacer esto sin poner una directiva import estática para myClass en la parte superior del archivo?

Respuesta

5

La directiva #import no "importación" una clase - se inserta el texto del fichero indicado en el archivo actual. Obviamente, esto no es útil en el tiempo de ejecución una vez que la fuente ha sido compilada.

Lo que desea es crear un paquete con las clases y dynamically load the bundle. Para poder hablar con las clases desde el programa principal, es probable que desee tener algún protocolo común que implementen las clases empaquetadas.

+5

Por supuesto, no puede cargar dinámicamente el paquete para iPhone. –

+0

@Jason Coco: ¿No es así? NSBundle está documentado como que trabaja en iOS. Siempre y cuando no estés descargando un código externo, creo que estarás bien. – Chuck

+0

Parece que "paquetes cargables" es lo que quiero, y según la documentación de Apple "La creación y el uso de paquetes cargables no son compatibles con iOS". Supongo que Apple no quiere que las personas creen marcos dinámicos geniales en iOS como yo quiero hacer, o que aún no los apoye. –

25

Puede usar el método NSClassFromString. Por lo tanto:

// Creates an instance of an NSObject and stores it in anObject 
id anObject = [[NSClassFromString(@"NSObject") alloc] init]; 

Un poco más de código de ejemplo en respuesta a tu edición:

NSString* myClassString = getClassName(); 
// if the class doesn't exist, myClass will be Nil and myVar will be nil 
Class* myClass = NSClassFromString(myClassString); 
id myVar = [[myClass alloc] init]; 
+0

Desafortunadamente, parece que crea una instancia de nil, cuando me gustaría crear una instancia de myClass. Tal vez esto simplemente no es posible en Objective-C? En Python puedo cargar módulos dinámicamente en tiempo de ejecución dependiendo de la lógica de la aplicación. Esperaba que hubiera una manera de hacer esto en Objective C. –

+0

@Jacob Lyles: 'NSClassFromString()' devuelve nil si no se encontró dicha clase. Parece que tu clase no está cargada en la aplicación. En ese caso, es posible que desee ver mi respuesta. – Chuck

0

Gracias a Chuck por señalarme el camino correcto, pero la respuesta correcta para esta consulta parece ser que es imposible en iOS 4.1, aunque es posible con el SDK de Mac OSX actual que utiliza paquetes cargables.

+0

donde mencionaste que estabas preguntando sobre IOS 4.1 –

Cuestiones relacionadas