Objekte erstellen

Objekte erstellen
Um ein Objekt programmatisch zu erstellen - egal ob aus einer eigenen Klasse oder aus einer Cocoa-Klasse - muss man zunächst den Speicher dafür reservieren (alloziieren) und es dann Initialisieren. Initialisieren bedeutet, dass das Objekt mit den wichtigsten Daten befüllt wird, so dass es funktionsfähig ist. Das Alloziieren passiert über den Klassennamen, das Initialisieren über das Objekt. Hier ein Beispiel:
NSString* string1;          // einen Zeiger vom Typ NSString erstellen
string1 = [NSString alloc]; // Speicher für den NSString reservieren
[string1 init];             // Das Objekt initialisieren

Im Normalfall schreibt man alles in eine Zeile und verschachtelt alloc und init. Folgende Zeile hat also den gleichen Effekt:
NSString* string1 = [[NSString alloc] init];

Hierfür gibt es zusätzlich nochmal eine Kurzform, die den gleichen Effekt hat:
NSString* string1 = [NSString new];

Nun macht die obige Zeile im Fall von NSString wenig Sinn. Man kann NSString nämlich nach dem init nicht mehr verändern, also keine Zeichenkette mehr zuweisen (im Gegensatz zur Klasse NSMutableString). Daher haben solche Objekte erweiterte init-Methoden, die eine zusätzliche Parameter-Übergabe erlauben, um zum Beispiel einen NSString mit einem Wert zu befüllen. Alle init-Methoden finden sich zu jeder Klasse in der Dokumentation in Xcode. Hier ein Beispiel:
NSString* string1 = [[NSString alloc] initWithString:@"Hallo Welt!"];

Hier wird ein String mit einem anderen String (@"Hallo Welt") befüllt. Nochmal zur Erinnerung: Das ist nur ein Beispielkonstrukt. Das @-Zeichen vor einem doppelten Anführungszeichen ist ein sogenanntes Makro; also eine Kurzform zur Erstellung eines Strings. Da man String-Objekte sehr häufig benötigt, wurde dieses Makro eingeführt. Letztendlich erzeugt das @-Zeichen bereits einen NSString. Davon wird oben dann ein weiterer String erstellt, also eine Kopie.

Wenn man den String nicht mehr benötigt, dann sollte man nicht vergessen den Speicher wieder freizugeben:
[string1 release];

Das Retain- und Release Konzept von Cocoa ist ein eigenes, großes Thema. Wir haben das in unserem Videocast, beginnend mit der Folge '#007: Speicher, Zeiger und Objekte' thematisiert. Zusätzlich gibt es den Grundlagenartikel Retain, Release und Autorelease.
5 Kommentare | Permalink | Trackback-Info

Anzeige / Partnerlink

Kommentar hinzufügen

 
Name:
Email (optional):
Text:
Sicherheitscode:
Bitte geben Sie hier die unten abgebildete 5-stellige Zahl aus dem Bild ein!
Um die 1 besser von der 7 unterscheiden zu können, hat die 1 unten immer einen waagerechten Strich.

5. Marco am 3. Jul 2010, 12:07 Uhr

@Witold
danke für die Erklärung. Genau das hat mir geholfen.

@Ingo & Peter: Super PodCast

4. Witold am 20. Mar 2010, 13:22 Uhr

@Thomas,Frank:

"name" ist ja erstmal nur ein Zeiger, also eine Adresse.

Der Speicherplatz wo der Inhalt von "eingabe" liegt, wurde schon durch das Erzeugen des "eingabe-"Objektes reserviert, ist also unabhängig vom "name"-Objekt vorhanden.
Mit
name = [eingabe stringValue]
setzt ihr den Zeiger auf diesen bereits vorhanden Speicherplatz.

Ihr braucht also keinen neuen Speicherplatz zu allokieren.

Anders wäre es wenn ihr den Inhalt der in [eingabe stringValue] liegt kopieren wolltet. Dann müsstet ihr neuen Speicherplatz allokieren.

3. Frank am 25. Feb 2010, 15:53 Uhr

@Thomas: Die Frage stelle ich mir auch...leider sehe ich es gibt noch keine Antwort.....

2. Thomas am 22. Oct 2009, 16:06 Uhr

Hallo Ingo,

irgendwie habe ich noch ein Problem mit der Erzeugung von Objekten.

NSString * name //Pointer setzen
name = [eingabe stringValue]

Mit den o.g. Zeilen erzeuge ich doch ein Objekt name vom Typ NSString.

Warum muss man hier nicht mit alloc vorab den Speicher reservieren ?

Ansonsten ein klasse Podcast, weiter so.

Viele Gruesse

Thomas

1. mrgamewatch am 2. Sep 2009, 01:20 Uhr

Ahh, ich kann mich irgendwie besser konzentrieren, wenn Ihr mir das vorlest ;)
Aber na gut, wenigstens ein bisschen was hab ich verstanden. Und eig. hab ich ja gar keinen Mac :)
Macht bitter weiter mit dem Podcast!