iphone - Dynamisch instanziierende Klassen in Objective-C möglich?




xml cocoa (3)

Klassen sind Objekte und können wie andere Objekte verwendet / gesendet werden.

So erstellen Sie ein Klassenobjekt:

Class classForElement = [MyUserClass class];

So instanziieren Sie ein Objekt dieser Klasse

id newObject = [[classForElement alloc] init];

Wenn der Klassenname nicht mit dem Elementnamen übereinstimmt, erstellen Sie ein Wörterbuch mit der Klasse als Objekt und dem Elementnamen als Schlüssel.

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

Mein Problem ist folgendes. Ich habe eine Methode, die einfach einen XML-Auszug und einen XPath nimmt. Es sollte mir dann ein Array von Objekten für diesen XML-Ausschnitt erstellen. Bedeutung, wenn ich den folgenden XML übergeben werde:

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

Meine Methode instanziiert eine Instanz der Klasse User und verwendet Schlüsselwertcodierung, um die Instanzvariablen festzulegen. Es ist ziemlich geradlinig. Das einzige Problem ist, dass ich hauptsächlich von einem Skript-Hintergrund komme und versuche herauszufinden, ob es möglich ist, der Methode einen Klassennamen zu geben. Im Moment macht es eine User-Klasse, später könnte es eine Cars-Klasse und dann eine Home-Klasse sein. Was ist der beste Weg, um Objekte von dieser Methode unterschiedlichen Typs zu instanziieren, während der Code so abstrakt wie möglich gehalten wird?


Um eine Klasse mit ihrem Namen zu instanziieren, können Sie NSClassFromString verwenden :

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

Verwenden Sie id als Parametertyp in Ihrer Methodensignatur. Ein ID-Objekt kann in ein Klassenobjekt typisiert werden

Machst du das Projekt für ein iPhone. Verwenden Sie NSXMLNode? Bitte beachten Sie, dass die Verwendung von NSXMLNode nur im Simulator erlaubt ist. Es funktioniert nicht auf dem iPhone, da NSXMLNode ein Teil der Core-Bibliothek ist.





cocoa-touch