10.06.2008

NSArray und NSMutableArray

In diesem Artikel werden die Klassen NSArray und NSMutableArray kurz beschrieben. Außerdem wird die Anwendung einiger weniger ausgewählter Funktionen demonstriert.

Die folgende Funktion zeigt die Verwendung von NSArray.

			
void arrayTest() {
	//Declare NSArray
	NSArray* array;
	
	//Declare NSNumber
	NSNumber* number;
	//Alloc and init NSNumber with 42
	number = [[NSNumber alloc]initWithInt:42];
	
	//Alloc and init NSArray with a NSNumber and a NSString
	array = [[NSArray alloc]initWithObjects: number, @"Arthur Dent", nil];
	
	//Print the content of the array
	print(array);
	
	//Release number and array
	[number release];
	[array release];
}

Als ersters wird eine Variable array deklariert. Danach wird eine Variable number deklariert, allokiert und mit 42 initialisiert. Dann wird das array allokiert und mit Objekten number und "Arthur Dent" initialisiert. Abließend wird ein nil übergeben um das Ende des Arrays die signalisieren. Mit print werden die Elemente des array auf der Console ausgegeben.

Die Funktion print sieht folgendermaßen aus:

void print(NSObject* aCollection) {
	//Declare a NSEnumerator
	NSEnumerator* aEnum;
	
	//Declare an object
	id object;
	
	//Get an enumerator
	aEnum = [aCollection objectEnumerator];
	
	//Iterate while there is a next object
	while( (object = [aEnum nextObject]) ) {
		//Print object
		NSLog(@"%@",object);
	}
}

Die Print-Funktion erzeugt einen Enumerator indem die Nachricht objectEnumerator an die Collection geschickt wird. Da NSArray von NSObject erbt, ist die Parameterübergabe an die print-Funktion richtig. Obwohl die Klasse NSObject keine Funktion objectEnumeratorbesitzt, kommt die Nachricht bei der Klasse NSArray an. Der Enumerator wird verwendet um in der while-Schleife über die Collection zu iterieren. Bei jedem Schleifendurchlauf wird der Wert des Element ausgegeben.

Wie in dem Beispiels zu sehen ist, müssen die Werte innerhalb des Arrays während die Initialisierung übergeben werden. Sie können danach nicht mehr verändert werden. (Die Objekte selbst schon, aber nicht innerhalb des Arrays.). D.h. es können keine Elemente gelöscht oder hinzugefügt werden. Abhilfe schafft die Klasse NSMutableArray, die im Folgenden erklärt wird.

void arrayMutableTest() {
	//Declare NSMutableArray
	NSMutableArray* array;
	
	//Allocate and init the NSMutableArray
	array = [[NSMutableArray alloc] init];
	
	//Declare NSNumber
	NSNumber* number;
	//Alloc and init NSNumber with 42
	number = [[NSNumber alloc]initWithInt:42];
	
	//Insert a NSNumber at index 0
	[array insertObject:number atIndex:0];
	
	//Insert a NSString at the end of the array
	[array insertObject:@"Arthur Dent" atIndex:[array count]];
	
	//Print the content of the array
	print(array);
	
	//Release number and array
	[number release];
	[array release];	
}

In dieser Funktion wird ein NSMutableArray deklariert, allokiert und initialisiert. Dieses Array enthält zu Beginn keine Elemente. Dann wird wieder ein Objekt vom Typ NSNumber erzeugt und an der ersten Position (Index 0) eingefügt. Als nächstes wird ein String am Ende eingefügt. Dafür wird die Funktion count des Array aufgerufen um den maximalen Index zu bestimmen. Dann wird das Array auf der Console ausgegeben. Da NSMutableArray von NSArray erbt, kann die gleiche print-Funktion wie schon in der Funktion arrayTest verwendet werden.

Die Ausgabe auf der Console sieht folgendermaßen aus:

2008-06-10 20:11:32.519 ContainerTest[51835:10b] 42
2008-06-10 20:11:32.522 ContainerTest[51835:10b] Arthur Dent
2008-06-10 20:11:32.522 ContainerTest[51835:10b] 42
2008-06-10 20:11:32.522 ContainerTest[51835:10b] Arthur Dent