2008-12-19 5 views
21

Mi problema es el siguiente. Tengo un método que simplemente toma un fragmento de XML y un XPath. Entonces debería crearme una matriz de objetos para ese fragmento de XML. Es decir, si me pasé el siguiente código XML:Clases dinámicas de creación de instancias en Objective-C, ¿es posible?

<user> 
    <name>Bob</name> 
    <age>50</age> 
</user> 

Mi método será crear una instancia de la clase de usuario y el uso de clave-valor de codificación para establecer las variables de instancia. Es bastante directo. El único problema es que procedo principalmente de un fondo de scripts e intento ver si es posible pasarle un nombre de clase al método. En este momento está haciendo una clase de usuario, más tarde podría ser una clase Cars y luego una clase Home. ¿Cuál es la mejor manera de crear instancias de objetos de este método de diferente tipo mientras se mantiene el código lo más abstracto posible?

Respuesta

54

Para crear instancias de una clase utilizando su nombre, puede utilizar NSClassFromString:

id obj = [[NSClassFromString(@"MySpecialClass") alloc] init]; 
23

clases son objetos y se pueden usar/enviado al igual que otros objetos.

Para crear un objeto de clase:

Class classForElement = [MyUserClass class]; 

para crear instancias de un objeto de esa clase

id newObject = [[classForElement alloc] init]; 

Si el nombre de la clase no es el mismo que el nombre del elemento, crear un diccionario que tiene la Clase como el objeto y el nombre del elemento como la clave.

[NSDictionary dictionaryWithObjectsAndKeys: 
         [MyUserClass class], @"user", 
         [MyCarClass class], @"car", 
         [MyHomeClass class], @"home", 
          nil]]; 
1

Desea echar un vistazo en profundidad a los datos básicos. Managed Objects podría venir al rescate.

CocoaDevCentral tiene algunos artículos introductorios, pero es probable que necesite los documentos de Apple.

http://cocoadevcentral.com/articles/000086.php

[editar] Sólo vino a la memoria que usted está haciendo esto en un iPhone. La falta de disponibilidad del marco de Core Data no significa que no pueda tomar prestado de él, y simplemente volver a implementar lo que necesita. Uno de los frameworks OpenStep de código abierto puede tener código.

En un dispositivo móvil es posible que desee tener cuidado con el tamaño de sus datos.

Esdras Epstein en tiempo de ejecución creación de clases (y más):

http://www.macdevcenter.com/pub/a/mac/2002/05/24/runtime_partone.html

+0

Tenga en cuenta la etiqueta de toque de cacao. Core Data no existe en el iPhone. –

+0

Proporciona la solución, sin embargo. Recrear un subconjunto mínimo –

0

Intente utilizar como identificación del tipo de parámetro en la firma del método. Un objeto id se puede convertir en un objeto de clase

¿Está haciendo el proyecto para un iPhone? ¿Estás usando NSXMLNode? En caso de que lo esté, tenga en cuenta que el uso de NSXMLNode solo se permitirá en el simulador. No funcionará en el iPhone ya que NSXMLNode forma parte de la biblioteca principal.

Cuestiones relacionadas