Arrays aus eigenen Klassen
Ein NSArray kann man natürlich nicht nur mit Objekten von Cocoa-Klassen füllen, auch Objekte aus selbst erstellten Klassen sind ebenfalls möglich und es geht auch cht viel schwieriger. Gegeben sei die schon aus anderen Lektionen bekannte Klasse Person, von der im Beispiel zwei Instanzen erzeugt werden.
Ein NSArray kann man natürlich nicht nur mit Objekten von Cocoa-Klassen füllen, auch Objekte aus selbst erstellten Klassen sind ebenfalls möglich und es geht auch cht viel schwieriger. Gegeben sei die schon aus anderen Lektionen bekannte Klasse Person, von der im Beispiel zwei Instanzen erzeugt werden.
| Person
*myPerson1 = [[Person alloc] init]; [myPerson1 setName:@"Huber"]; [myPerson1 setVorname:@"Hans"]; [myPerson1 setAlter:32]; Person *myPerson2 = [[Person alloc] init]; [myPerson2 setName:@"Adrian"]; [myPerson2 setVorname:@"Fischer"]; [myPerson2 setAlter:55]; NSArray *myArray; myArray = [NSArray arrayWithObjects:myPerson1,myPerson2,nil]; |
Zwar wurde zuvor behauptet, Arrays könnten keinen einfachen Datentypen aufnehmen, doch gilt das nicht für Objekte, die einfache Datentypen enthalten. Diese können selbstverständlich in einem Array gespeichert werden. Die Klasse Person verwaltet den Typ alter (int), und das Array verwaltet nur die Speicheradresse des Objektes. Dies ist eine Möglichkeit, auch primitive Datentypen in einem NSArray abzulegen.
Mit den beschriebenen Anweisungen werden zwei Person-Objekt in Array gespeichert. Bleibt die Frage, wie man sie wieder heraus bekommt. Da so ein Objekt mehrere Eigenschaften enthält, ist etwas mehr Aufwand nötig, als das noch bei einem NSString der Fall war. Das ganze Objekt einfach auf der Konsole auszugeben, ist nicht so ohne weiteres möglich.
Mit den beschriebenen Anweisungen werden zwei Person-Objekt in Array gespeichert. Bleibt die Frage, wie man sie wieder heraus bekommt. Da so ein Objekt mehrere Eigenschaften enthält, ist etwas mehr Aufwand nötig, als das noch bei einem NSString der Fall war. Das ganze Objekt einfach auf der Konsole auszugeben, ist nicht so ohne weiteres möglich.
| for(int
i = 0;
i < [myArray count]; i++) { Person *aPerson = [myArray objectAtIndex:i]; NSLog([aPerson name]); NSLog([aPerson vorname]); NSLog(@"%i",[aPerson alter]); } |
Da das Array nur Speicherzeiger verwaltet, ist es nicht weiter schwer, diesen Zeiger einer weiteren Person zuzuweisen. Wie man gut sieht, wird nicht mit alloc und init gearbeitet, da kein neues Objekt erzeugt werden soll. Der Bezeichner aPerson erhält nur einen Verweis auf ein schon existierendes Objekt.
Möchte man ein wenig Programmierarbeit sparen, kann man die Anweisungen auch zusammenfassen, indem man eingebettete Methoden (nested methods) verwendet. Dann erübrigt sich auch die Deklaration einer weiteren Person.
Möchte man ein wenig Programmierarbeit sparen, kann man die Anweisungen auch zusammenfassen, indem man eingebettete Methoden (nested methods) verwendet. Dann erübrigt sich auch die Deklaration einer weiteren Person.
| NSArray
*myArray; myArray = [NSArray arrayWithObjects:myPerson1,myPerson2,nil]; for(int i = 0; i < [myArray count]; i++) { NSLog( [[myArray objectAtIndex:i] name] ); NSLog( [[myArray objectAtIndex:i] vorname]); NSLog(@"%i",[[myArray objectAtIndex:i] alter]); } |
