• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Frage zu Objective-C Tuturial

flo911

Roter Delicious
Registriert
02.12.06
Beiträge
93
Hallo,
Ich will Objective-C lernen und habe mir deshalb folgendes Tutorial durchgelesen. Zu Kapitel 12 hätte ich eine Frage, vielleicht kann mir hier jemand weiterhelfen:
Pointers again
//[2]
NSString *favoriteComputer; //2.1
favoriteComputer = @"Mac!"; // 2.2
NSLog(favoriteComputer); //2.3

Ich hab das so verstanden, dass favoriteComputer eine Pointer Variable ist, in der die Adresse eines Strings gespeichert ist. In der Zeile 2.2 wird jetzt favoriteComputer der Wert Mac zugewiesen, warum wird jetzt der String verändert auf den die Pointer Variable zeigt und nicht die Adresse die in der Variable gespeichert ist?
Im Kapitel davor wurden Pointer behandelt und dort steht das man um den Wert zu verändern, auf den eine Pointer Variable zeigt einen * vor dem Variablennamen setzten muss.
int *y;
y = &x;
*y = 5 is equivalent to
x = 5

Gruß Flo
 

Calanda

Tokyo Rose
Registriert
04.03.08
Beiträge
69
@below: Stimmt, das glaub ich dir sogar ;) Ich habe noch ein wenig gesucht und gelesen und festgestellt, dass es tatsächlich den Stern nicht braucht. Nun aber frage ich mich wieso das so ist. In C sieht es ja wie oben beschrieben so aus:
int x;
int *ip; /* pointer to int */
ip = &x; /* ip points to x */
*ip = 0; /* x = 0 */

Ich nehme an in Objective-C hat es mit dem Objekt NSString zu tun. Habe ich beispielsweise folgendes
NSString *meinText;
meinText = @"Hallo Welt!";
funktioniert das einwandfrei. Irgendwie fehlt mir da jetzt der Hintergrund. Das @ zeigt ja scheinbar den Anfang von NSString an. Aber ich habe diesbezüglich keine Informationen gefunden wieso und weshalb. Ich habe das Buch "Objective-C und Cocoa" aber auch da geht es nicht so tief ins Detail und Google hat auch nicht wirklich weitergeholfen.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Code:
NSString *meinText;
meinText = @"Hallo Welt!";
funktioniert das einwandfrei. Irgendwie fehlt mir da jetzt der Hintergrund.
Also, die erste Zeile deklariert einen Pointer meinText. Dieser Pointer zeigt an der Stelle noch irgendwo hin, enthält also noch keinerlei nützliche Information. In der zweiten Zeile wird dem Pointer meinText die Adresse des NSString-Objekt @"Hallo Welt!" zugewiesen. Die Syntax @"..." wird vom Compiler in ein NSString-Objekt übersetzt und im Programmcode gespeichert. Wenn das Programm geladen wird, wird auch dieses NSString-Objekt in den Speicher geladen und die Speicheradresse, wo das NSString-Objekt dann liegt, wird dem Pointer meinText dann zu Laufzeit zugewiesen.

MacApple
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Wie bereits erwähnt, ist das @"Mac!" ein Pointer auf ein String-Objekt mit dem Text "Mac!". Du weist also der Pointervariablen einen Pointer auf ein String-Objekt zu. In Objective-C gibt es genau 0 Möglichkeiten, unmittelbar mit einem Objekt zu arbeiten. Man kann immer nur mit Pointern (besser: IDs) von Objekten arbeiten.

Noch eine andere Anmerkung. Das NSLog()
Code:
NSLog( favoriteComputer )
ist mindestns gefährlich, wie man leicht bei einer Programmänderung belegen kann:
Code:
favoriteComputer = @"Computer: %@ OS: %@ Version %d.%d";
NSLog( favoriteComputer );
Wenn man wirklich einen Text ausgeben will, so sollte man diesen in einem Formatstring platzieren:
Code:
NSLog( @"%@", favoriteComputer );
Das führt im Fehlerfalle nur zu seltsamen Ausgaben und nicht gleich zur Explosion des Rechners.