2008-12-19 4 views
21

Mon problème est le suivant. J'ai une méthode qui prend simplement un extrait XML et un XPath. Il devrait ensuite me créer un tableau d'objets pour cet extrait XML. Signification si je suis passé le code XML suivant:Des classes dynamiquement instables en Objective-C, possibles?

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

Ma méthode instancier une instance de l'utilisateur de classe et d'utiliser la valeur de codage clé pour définir les variables d'instance. C'est plutôt simple. Le seul problème est que je viens surtout d'un arrière-plan de script et essaye de voir s'il est possible de passer un nom de classe à la méthode. En ce moment, il fait une classe User, plus tard, il peut s'agir d'une classe Cars, puis d'une classe Home. Quelle est la meilleure façon d'instancier des objets à partir de cette méthode de type différent tout en gardant le code aussi abstrait que possible?

Répondre

54

Pour instancier une classe en utilisant son nom, vous pouvez utiliser NSClassFromString:

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

Les classes sont des objets et peuvent être utilisés/envoyé la même chose que d'autres objets.

Pour créer un objet de classe:

Class classForElement = [MyUserClass class]; 

Pour instancier un objet de cette classe

id newObject = [[classForElement alloc] init]; 

Si le nom de classe n'est pas le même que le nom de l'élément, créer un dictionnaire qui a le Classe comme objet et le nom de l'élément comme clé.

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

Vous souhaitez jeter un coup d'œil aux Core Data. Les objets gérés pourraient venir à la rescousse. CocoaDevCentral a quelques articles d'introduction, mais vous avez probablement besoin des docs Apple.

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

[modifier] Je viens de me rappelle que vous faites cela sur un iPhone. L'indisponibilité du Core Data Framework ne signifie pas que vous ne pouvez pas en emprunter et que vous réimplémentez simplement ce dont vous avez besoin. L'un des frameworks OpenStep Open Source peut avoir du code.

Sur un appareil mobile, vous voudrez peut-être faire attention à la taille de vos données.

Ezra Epstein sur la création d'exécution des classes (et plus):

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

+0

Notez l'étiquette tactile cacao. Les données de base n'existent pas sur l'iPhone. –

+0

Il fournit la solution, cependant. Recréer un sous-ensemble minimal –

0

Essayez d'utiliser id comme type de paramètre dans votre signature de la méthode. Un objet id peut être de type moulé sous pression dans un objet de classe

-vous en train de faire le projet pour un iPhone. Utilisez-vous NSXMLNode. Dans le cas où vous êtes, sachez que l'utilisation de NSXMLNode ne sera autorisée que sur le simulateur. Cela ne fonctionnera pas sur l'iPhone car NSXMLNode fait partie de la bibliothèque principale.