Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
NSString im Debugger

Nachdem Sie nun einige Grundlagen von NSString kennen, nun ein kleiner Ausflug in die Welt der Speicherzeiger. NSString verhält sich hier nämlich sehr interessant.

Ein NSString ist unveränderlich. Nachdem eine Zeichenkette einmal angelegt und initialisiert wurde, kann sie nicht mehr verändert werden. Das klingt vielleicht zu Anfang sehr merkwürdig und unpraktisch, hat aber durchaus einen logischen Hintergrund.

Texte belegen wie alle Objekte natürlich Speicherplatz. Stellen Sie sich den Speicher wie eine Reihe von Schachteln vor, in denen jeweils ein Buchstabe liegt. Zusammen bilden diese Schachteln dann einen Text. Danach folgt weiterer Speicher, weitere Schachteln für andere Texte oder Zahlen oder ganz etwas anderes. Wird der Text aber jetzt plötzlich länger, würde das ja bedeuten, dass Sie die Inhalt der anderen Schachteln neu verteilen und verschieben müssten. Der Text muss schließlich an einem Stück im Speicher stehen. Es wird sicher sehr schnell klar, dass eine ständige Verschiebung von Speicherplatz nicht sehr wünschenswert ist. Aus diesem Grund sind NSString Objekte unveränderlich.

Die Aussage, ein NSString könne nicht verändert werden, führt natürlich sehr schnell zu Missverständnissen. Den Text können Sie natürlich jeder Zeit ändern. Probieren Sie mal folgenden Code.
NSString *textstring = @"Hallo Welt!";
textstring =
@"Hallo andere Welten!";
NSLog(
@"%@",textstring);
Natürlich funktioniert dieser Code problemlos, es wäre auch schlimm, wenn das nicht der Fall wäre. Was Sie allerdings nicht sehen, in Wirklichkeit haben Sie zwei unterschiedliche Objekte. Der Text „ Hallo andere Welten! “ überschreibt nicht etwa den Speicherplatz von „ Hallo Welt! “ (wie sollte das auch gehen, er ist ja viel länger!), sondern belegt neuen, bis dahin freien, Speicher. Es stehen also beide Texte im Speicher, nur dass der Zeiger von textstring jetzt auf eine andere Position zeigt. Der ursprüngliche Wert ist zwar noch irgendwo vorhanden, aber nicht mehr ansprechbar.

Obwohl das Anlegen neuen Speicherplatzes völlig automatisch passiert, kann man es dennoch sichtbar machen. Hier hilft des Debuggers von Xcode.

Setzen Sie zunächst einen Haltepunkt, vor der ersten Codezeile, indem Sie im Editor auf die Spalte mit den Zeilennummer klicken. Ein blauer Pfeil wird erscheinen. Dies ist ein Breakpoint, ein Haltepunkt, an dem der Programmablauf während der Ausführung stehen bleibt.
stacks_image_32148129-8EA8-404B-9FF5-C8E02EE086E8
Öffnen Sie nun den Debugger, Sie finden ihn im „Run“-Menü von Xcode. Auch hier gibt es das schon bekannte Symbol „Build and go“ oder „Build and Run/Debug“ wenn Sie Xcode 3.2 verwenden. Klicken Sie auf diese Schaltfläche, um das Programm zu erstellen und auszuführen. Es wird starten, aber am ersten Haltepunkt stehen bleiben.

Der Programmablauf bleibt immer vor der markieren Zeile stehen, die blau hinterlegten Befehle wurden noch nicht ausgeführt. Deshalb wurde textstring auch noch keine Speicheradresse zugewiesen. Je nach Xcode Version wird als Wert nil oder invalid angezeigt.
stacks_image_66F9AFFB-C7E0-4AAE-8AC5-779A6A9C7827
Klicken Sie nun auf Step Into in der Werkzeugleiste des Debugger. Der Programmablauf wird zur nächsten Anweisung springen. Jetzt bekommt textstring auch einen Inhalt und eine Speicheradresse.
stacks_image_EE62633C-F843-4C99-8439-4A9D8BE12F22
Klicken Sie erneut auf Step Into, um einen Schritt weiter zu gehen. Der Text ändert sich und auch die Speicheradresse wird eine andere.
stacks_image_0E225A45-662B-4285-B80A-EF7E1DCB028E
Gehen Sie noch einen Schritt weiter und der Text wird auf dem Konsolenfenster ausgegeben.

Mit dem Debugger können Sie nicht nur die Postion des Speicherzeigers ansehen, Sie können sie sogar ändern. Diese Möglichkeit ist natürlich mit Vorsicht zu genießen, aber probieren Sie es ruhig einmal.
Gehen Sie schrittweise durch das Programm bis textstring auf „ Hallo Welt!“ zeigt. Merken Sie sich diese Speicheradresse und gehen Sie weiter, bis "Hallo andere Welten!" Ziel des Zeigers wird. Normalerweise würde dieser Text auch durch das folgende NSLog ausgegeben. Doppelklicken Sie auf das Feld mit der Speicheradresse im Debugger. Sie können es nun editieren. Tragen Sie jetzt die ursprüngliche Adresse ein und der ursprüngliche Text wird ausgegeben, sobald Sie einen Schritt weiter gehen.

Diese Art der Speichermanipulation im Debugger ist sehr praktisch, kann aber auch gefährlich sein. Sobald textstring auf einen anderen Speicherbereich zeigt, gibt es keine Referenz mehr auf den ursprünglichen Text. Objekte ohne Referenz sind aber immer der Gefahr ausgesetzt, dass ihr Speicherplatz freigegeben wird.

Trotzdem sollten Sie nicht davor zurückschrecken, mit dieser Funktion zu experimentieren. Erstellen Sie noch mehr Texte oder verändern Sie den Zeiger so, dass er auf eine Speicheradresse verweist, an der gar kein Text steht. Ihr Programm wird mit ziemlicher Sicherheit abstürzen, probieren Sie es trotzdem!

nächste Seite