NSMutableArray
Ein NSArray hat trotz all seiner Möglichkeiten einen entscheidenden Nachteil: Schon bei der Initialisierung muss festgelegt werden, wie viele Objekte das Array enthalten soll. Nachträglich weitere Objekte anzuhängen, ist nicht möglich. Ebenfalls ist nicht möglich ist es, Objekte aus der Auflistung zu entfernen, obwohl das eventuell wünschenswert wäre. Abhilfe für diese Probleme schafft eine Klasse, die von NSArray erbt, die Klasse NSMutableArray.
Mutable bedeutet "veränderlich" und das beschreibt diese Klasse schon sehr gut. Objekte können hinzugefügt und entfernt werden. Ausserdem können Objekte ihre Positionen im Array tauschen, was eine Sortierung der Objekte im Array möglich macht. In der Funktionsweise unterscheidet sich NSMutableArray wenig von dem bisher gelernten, da die Klasse Eigenschaften und Methoden von NSArray erbt, sind Aufrufe wie objectAtIndex und count auch weiterhin möglich.
Der größte Unterschied besteht bei der Initialisierung eines solchen Objektes. Zwar gibt es weiterhin die Methode arrayWithObjects, neu hingegen ist die Methode arrayWithCapacity, die ein Array für eine bestimmt Anzahl von Objekten vorbereitet.
Ein NSArray hat trotz all seiner Möglichkeiten einen entscheidenden Nachteil: Schon bei der Initialisierung muss festgelegt werden, wie viele Objekte das Array enthalten soll. Nachträglich weitere Objekte anzuhängen, ist nicht möglich. Ebenfalls ist nicht möglich ist es, Objekte aus der Auflistung zu entfernen, obwohl das eventuell wünschenswert wäre. Abhilfe für diese Probleme schafft eine Klasse, die von NSArray erbt, die Klasse NSMutableArray.
Mutable bedeutet "veränderlich" und das beschreibt diese Klasse schon sehr gut. Objekte können hinzugefügt und entfernt werden. Ausserdem können Objekte ihre Positionen im Array tauschen, was eine Sortierung der Objekte im Array möglich macht. In der Funktionsweise unterscheidet sich NSMutableArray wenig von dem bisher gelernten, da die Klasse Eigenschaften und Methoden von NSArray erbt, sind Aufrufe wie objectAtIndex und count auch weiterhin möglich.
Der größte Unterschied besteht bei der Initialisierung eines solchen Objektes. Zwar gibt es weiterhin die Methode arrayWithObjects, neu hingegen ist die Methode arrayWithCapacity, die ein Array für eine bestimmt Anzahl von Objekten vorbereitet.
|
NSMutableArray
*myArray; myArray = [NSMutableArray arrayWithCapacity:10]; |
Diese Kapazität ist keineswegs die Maximalgröße des Arrays, und es werden auch keine zehn „leeren“ Objekte irgendwo im Speicher abgelegt. Es ist lediglich ein Hinweis auf die eventuelle Größe des Arrays und dient zu Optimierung des Maschinencodes. Ob dieses Array später ein oder einhundert Objekte aufnimmt, ist bei der Initialisierung nicht von Belang.
Nachdem das Array auf diese Art vorbereitet wurde, kann mit weiteren Anweisungen ein oder mehrere Objekte hinzugefügt werden.
Nachdem das Array auf diese Art vorbereitet wurde, kann mit weiteren Anweisungen ein oder mehrere Objekte hinzugefügt werden.
|
[myArray
addObject:@"Alpha"]; [myArray addObject:@"Beta"]; [myArray addObject:@"Gamma"]; |
Die Indexposition der Objekte im Array, ist abhängig von der Reihenfolge, mit der die Objekte dem Array hinzugefügt werden wurden. Möchte man hingegen wieder ein Objekt aus der Auflistung entfernen, funktioniert dies auch über die Indexposition.
| [myArray removeObjectAtIndex:1]; |
Es ist wichtig zu wissen, dass dabei keine Lücken im Array entstehen. Wird ein Objekt in der Mitte des Array entfernt, rücken alle Objekte nach und das Array wird kürzer.
Ausser über die Indexposition, lässt sich ein Element auch über das Objekt aus dem Array löschen. Dazu muss man natürlich das Objekt haben, um es als Parameter zu übergeben. Folgendes Beispiel beschreibt wie so etwas aussehen könnte.
Ausser über die Indexposition, lässt sich ein Element auch über das Objekt aus dem Array löschen. Dazu muss man natürlich das Objekt haben, um es als Parameter zu übergeben. Folgendes Beispiel beschreibt wie so etwas aussehen könnte.
|
NSMutableArray
*myArray; myArray = [NSMutableArray arrayWithCapacity:10]; NSString *myString1 = @"Alpha"; NSString *myString2 = @"Beta"; NSString *myString3 = @"Gamma"; [myArray addObject:myString1]; [myArray addObject:myString2]; [myArray addObject:myString3]; [myArray removeObject:myString2]; for(int i = 0; i < [myArray count]; i++) { NSLog(@"Index %d ist %@", i, [myArray objectAtIndex:i]); } |

Natürlich kann ein NSMutableArray auch weiterhin mit Objekten der Klasse Person gefüllt werden, der Typ NSString dient lediglich dazu, den Code schlank und übersichtlich zu halten.
Besonders interessant ist in diesem Zusammenhang auch der Aufruf von:
Besonders interessant ist in diesem Zusammenhang auch der Aufruf von:
| [myArray removeObject:@"Beta"]; |
Auch das würde funktionieren, obwohl diese Anweisung gar kein bekanntes Objekt benutzt, sondern ein neues Objekt angelegt wird.
Um das zu verstehen, muss man wissen, wie die Methode removeObject arbeitet. Sie verwendet, um ein Objekt zu finden, die isEqual-Methode der jeweiligen Klassen. Für NSString bedeutet das, es werden tatsächlich Texte verglichen. Deshalb werden alle Objekte, bei denen die Zeichenketten übereinstimmt, aus dem Array entfernt. Die Methode removeObjectIdenticalTo vergleicht hingegen wirklich die Speicheradressen.
Weitere nützliche Methoden sind in diesem Zusammenhang removeAllObjects, um ein Array komplett zu leeren, und removeLastObject, eine Anweisung, die immer das Objekt an der höchsten Indexposition entfernt.
nächste Seite
Um das zu verstehen, muss man wissen, wie die Methode removeObject arbeitet. Sie verwendet, um ein Objekt zu finden, die isEqual-Methode der jeweiligen Klassen. Für NSString bedeutet das, es werden tatsächlich Texte verglichen. Deshalb werden alle Objekte, bei denen die Zeichenketten übereinstimmt, aus dem Array entfernt. Die Methode removeObjectIdenticalTo vergleicht hingegen wirklich die Speicheradressen.
Weitere nützliche Methoden sind in diesem Zusammenhang removeAllObjects, um ein Array komplett zu leeren, und removeLastObject, eine Anweisung, die immer das Objekt an der höchsten Indexposition entfernt.
nächste Seite