Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
NSMutableArray

Ein NSArray hat trotz seiner Möglichkeiten einen entscheidenden Nachteil: Schon bei der Initialisierung muss festgelegt werden, wie viele Objekte das Array enthalten soll. Später im Programm weitere Objekte anzuhängen, ist nicht möglich. Ebenfalls ist nicht möglich, Objekte aus der Auflistung zu entfernen, obwohl das in machen Situationen eventuell wünschenswert wäre. Abhilfe für diese Probleme schafft eine Klasse, die von NSArray erbt und zusätzliche Funktionalität liefert, die Klasse NSMutableArray.
Das englische Mutable bedeutet "veränderlich" und das beschreibt das Verhalten der Klasse schon sehr gut. Objekte können jederzeit hinzugefügt und entfernt werden. Außerdem können Objekte ihre Positionen im Array tauschen, was eine Sortierung der einzelnen Objekte im Array ermöglicht. In der Funktionsweise unterscheidet sich NSMutableArray zwar ein wenig von NSArray, da die Klasse aber viele Eigenschaften und Methoden erbt, sind Aufrufe wie objectAtIndex und count auch weiterhin möglich.
 
Der größte Unterschied der beiden Klassen besteht bei der Initialisierung eines NSMutableArray-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 ohne die Objekte selbst festzulegen.
NSMutableArray *myMutableArray;
myMutableArray = [
NSMutableArray arrayWithCapacity:10];
Die angegebene Kapazität ist dabei keineswegs die Maximalgröße des Arrays, und es werden auch keine zehn „leeren“ Objekte im Speicher abgelegt. Es ist lediglich ein Hinweis auf die eventuelle Größe des Arrays und dient zur Optimierung des Maschinencodes. Ob dieses Array später ein oder einhundert Objekte aufnimmt, ist bei der Initialisierung nicht von Belang. Weiß man aber schon genau wie viele Objekte das Array enthalten soll, ist arrayWithCapacity eine gute Möglichkeit der Vorbereitung.

Nachdem das Array auf diese Art initialisiert wurde, können mit weiteren Anweisungen ein oder mehrere Objekte der Auflistung hinzugefügt werden.
[myMutableArray addObject:@"Alpha"];
[myMutableArray
addObject:@"Beta"];
[myMutableArray
addObject:@"Gamma"];
Die Indexposition der Objekte im Array, ist abhängig von der Reihenfolge, mit der die Objekte dem Array hinzugefügt werden. Möchte man hingegen wieder ein Objekt aus der Auflistung entfernen, funktioniert dies auch über die Indexposition.
[myMutableArray removeObjectAtIndex:1];
Es ist wichtig zu erwähnen, dass durch das Löschen von Objekten 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.

Außer über die Indexposition, lässt sich ein Verweis auch über das Objekt selbst aus dem Array entfernen. Folgendes Beispiel beschreibt, wie so etwas aussehen könnte.
stacks_image_2A23C0C4-AB89-4CE8-88E0-58EB14634F11
Natürlich kann ein NSMutableArray ebenfalls mit Objekten der Klasse Person oder anderen Objekten gefüllt werden. Der im Beispiel verwendetet Typ NSString hilft lediglich, den Code schlank und übersichtlich zu halten. Außerdem ermöglicht die Verwendung von Zeichenketten die Demonstration einer Besonderheit, wie der nächste Aufruf zeigt:
NSMutableArray *stringArray;
stringArray = [
NSMutableArray arrayWithCapacity:10];

NSString *string1 = @"Alpha";
NSString *string2 = @"Beta";
NSString *string3 = @"Gamma";

[stringArray
addObject:string1];
[stringArray
addObject:string2];
[stringArray
addObject:string3];

[stringArray
removeObject:string2];

for(int i = 0; i < [stringArray count]; i++)
{
    NSLog(@"Index %d ist %@", i, [stringArray objectAtIndex:i]);
}
[stringArray removeObject:@"Beta"];
Auch mit diesem Aufruf würde das zweite Objekt der Auflistung entfernt, obwohl diese Anweisung gar kein bekanntes Objekt benutzt, sondern innerhalb der Methode ein neues Objekt anlegt.
Hier ist es wichtig zu 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 übereinstimmen, aus dem Array entfernt. Das muss nicht in allen Situationen das gewünschte Ergebnis sein. Die Methode removeObjectIdenticalTo vergleicht hingegen wirklich die Speicheradressen und liefert dementsprechend andere Resultate.

Weitere nützliche Methoden der Klasse NSMutableString 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