31.05.2008

NSString erzeugen und freigeben

Der folgende Code-Schnipsel erzeugt ein Objekt vom Type NSString. Als erstes wird die Variable testString deklariert. Dann wird Speicher für die Variable reserviert und es wird ihr beim Initialisieren der Wert Hello World! zugewiesen. Dann erfolgt die Ausgabe auf der Console und die Freigabe des reservierten Speichers.

					#import <Foundation/Foundation.h>

					int main (int argc, const char * argv[]) {

					  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

					  //Declare variable
					  NSString* testString;

					  //Allocate memory
					  testString = [NSString alloc];

					  //Init the Variable
					  testString = [testString initWithString:@"Hello World!"];

					  //Print String
					  NSLog(testString);

					  //Release the memory
					  [testString release];

					  [pool drain];
					  return 0;
					}
					

Die Allokierung und Initialisierung der Variable läßt sich auch in einer Zeile zusammenfassen. Das sieht folgendermaßen aus:

					//Allocate memory
					testString = [[NSString alloc] initWithString:@"Hello World!"];
					

31.05.2008

Objekte erzeugen und freigeben

In diesem Artikel wird beschrieben wie eine eigene Klasse definiert und implementiert wird. Die Klasse hat getter und setter, die zum Setzen und zur anschließenden Ausgabe verwendet werden. Außerdem wird die Klasse in einem kleinen Beispiel verwendet. Als erstes wird die Klasse Car in der Header-Datei definiert.

#import <Cocoa/Cocoa.h>

@interface Car : NSObject {
 NSString* brand; //Car brand
 NSString* type; //Car type
}

// getter and setter for brand
- (NSString*)brand;
- (void)setBrand:(NSString*)newBrand;

// getter and setter for type
- (NSString*)type;
- (void)setType:(NSString*)newType;
@end

Das Auto hat zwei Variablen brand und type. Für jede dieser Variablen existiert ein getter und ein setter. Als nächstes kommt die Implementierung der Klasse:

#import "Car.h"

@implementation Car

- (NSString*)brand {
 return brand;
}

- (void)setBrand:(NSString*)newBrand {
 if(newBrand != brand) {
  [brand release];
  brand = [newBrand retain];
 }
}

- (NSString*)type {
 return type;
}

- (void)setType:(NSString*)newType {
 if(newType != type) {
   [type release];
   type = [newType retain];
 }
}
@end
			

Im Implementierungsteil werden in den gettern die Variable als return-Wert zurückgegeben. In den settern werden die übergebenen Werte einfach zugewiesen. Als letztes folgt die Verwendung der Klasse Car:

#import <Foundation/Foundation.h>
#import "Car.h"

int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 //Declare variable
 Car* testCar;

 //Allocate and initialize
 testCar = [[Car alloc] init];

 //set values with setters
 [testCar setType:@"Coupe"];
 [testCar setBrand:@"BMW"];

  //Print type and brand
  //Use getters to get the values
  NSLog(@"Car type:  %@", [testCar type]);
  NSLog(@"Car brand: %@", [testCar brand]);

  //Release memory
  [testCar release];
  [pool drain];
  return 0;
}
			

Als erstes wird die Variable deklariert. Dann wird sie allokiert und initialisiert. über die setter werden type und brand gesetzt. Zur Ausgabe werden die getter aufgerufen. Zum Schluß wird der allokierte Speicher von testCar wieder freigegeben.

31.05.2008

Objekte mit Parametern initialisieren

In diesem Artikel wird beschrieben wie während der Initialisierung auch Parameter gesetzt werden können. Als erstes wird die Klasse Car in der Header-Datei definiert.

#import <Cocoa/Cocoa.h>

@interface Car : NSObject {
	NSString* brand; //Car brand
	NSString* color; //Car color
}

//Init
- (Car*)initWithBrand:(NSString*)newBrand;
- (Car*)initWithBrand:(NSString*)newBrand color:(NSString*)newColor;

// getter and setter for brand
- (NSString*)brand;
- (void)setBrand:(NSString*)newBrand;

// getter and setter for color
- (NSString*)color;
- (void)setColor:(NSString*)newColor;

@end

Wichtig dabei sind die beiden Init-Funktionen. Mit der ersten Funktion wird nur die Marke gesetzt. Mit der zweiten Funktion werden Marke und Farbe beim Initialisieren gesetzt.

Als nächstes kommt die Implementierung der Klasse:

#import "Car.h"

@implementation Car

- (NSString*)brand {
	return brand;
}


- (void)setBrand:(NSString*)newBrand {
	if(newBrand != brand) {
		[brand release];
		brand = [newBrand retain];
	}
}


- (NSString*)color {
	return color;
}


- (void)setColor:(NSString*)newColor {
	if(newColor != color) {
		[color release];
		color = [newColor retain];
	}
}


- (Car*)initWithBrand:(NSString*)newBrand {
	self = [super init];
	[self setBrand:newBrand];
	return self;
}

- (Car*)initWithBrand:(NSString*)newBrand color:(NSString*)newColor {
	self = [super init];
	[self setBrand:newBrand];
	[self setColor:newColor];
	return self;
}

@end

Im Implementierungsteil sind auch wieder die Init-Funktionen wichtig. In beiden Funktionen wird zunächst init von NSObject aufgerufen. Dann werden die übergebenen Werte mit den passenden settern gesetzt. Als letztes wird das initialisierte Objekt zurückgegeben.

Als letztes folgt die Verwendung der Klasse Car:

#import <Foundation/Foundation.h>
#import "Car.h"


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	//Declare variable
	Car* testCar;

	//Allocate and initialize
	testCar = [[Car alloc] initWithBrand:@"Black" color:@"BMW"];

	//Print color and brand
	//Use getters to get the values
	NSLog(@"Car color:  %@", [testCar color]);
	NSLog(@"Car brand: %@", [testCar brand]);

	//Release memory
	[testCar release];

    [pool drain];
    return 0;
}

Wie man sieht, werden bei der Initialisierung die Werte Black und BMW an die Init-Funktion übergeben. (In dem Beispiel wird nur die Init-Funktion mit zwei Parametern aufgerufen.)