Objekte erstellen
Ingo / 30. Aug 2009, 11:37 Uhr.
Gespeichert in: Grundlagen
NSString* string1; // einen Zeiger vom Typ NSString erstellen
string1 = [NSString alloc]; // Speicher für den NSString reservieren
[string1 init]; // Das Objekt initialisierenIm Normalfall schreibt man alles in eine Zeile und verschachtelt
alloc und init. Folgende Zeile hat also den gleichen Effekt:Hierfür gibt es zusätzlich nochmal eine Kurzform, die den gleichen Effekt hat:
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:
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
Kommentar hinzufügen
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
@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.
@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.....
@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
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!
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!