• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Frage zu retain, new und copy

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
In einem Buch habe ich ein Beispiel zu den Methoden im Titel.

Ich habe mir erstmal unabhängig davon meine gedanken gemacht.

Sagen wir ich schreibe folgende Zeile:
Code:
NSString *newString = [NSString new]
dann zeigt newString auf irgendeine Speicherzelle sagen wir
es ist die Speicherzelle 1. Automatisch erhöht sich auch der retain Count um 1.

Dann habe ich eine zweite Zeile:
Code:
 NSString *string2 = [newString retain]
string2 zeigt jetzt auf die gleiche Speicherzelle wie newString.
Der retian Count von beiden Objekte ist jetzt 2.

Dann folgt eine dritte Zeile:
Code:
NSString *kopie = [newString copy]
Jetzt würde ich annehmen das sich der retain Count von newString nicht erhöht,
da das Objekt kopiert und dessen Inhalt in einer anderen Speicherzelle gespeichert wird.
Mein Buch sagt das ebenfalls.
Aber als ich dieses Beispiel in Xcode eingegeben habe, hab ich festgestellt, dass nach dem copy-Aufruf
der retain Count von newString = 3 ist.
Also wiederspricht sich das Ganze. Wie gesagt in meinem Buch steht der bleibt weiterhin auf 2.
Also was ist da falsch? Wie kann das sein? Das verstehe ich nicht. Kann mir da jemand weiterhelfen?
Ihr könnt das ja mal selbst ausprobieren.

LG
 
Ein NSString ist immutable und ein value object, also der Inhalt des Strings ist auch die "id", das lässt dem Compiler Spielraum für Optimierungen. Ein String wird nur ein einziges mal abgespeichert. Also ist ein copy am Ende nicht wirklich eine Kopie sondern zeigt auch nur wieder auf den "String".

Probier dein Beispiel mal mit einem eigenen Object aus.
 
Also es ist ja vorbildlich, dass du dich damit auseinandersetzen willst, aber... machst du das nur interessehalber? Mit new und retain muss sich doch seit ARC niemand mehr herumschlagen, es sei denn du brauchst 100% Kontrolle darüber wann deine Objekte freigegeben werden oder nicht.

Also, wenn deine Frage nicht rein wissenschaftliches Interesse hat, dann bei der Projekterstellung ARC einschalten! Du glaubst gar nicht, wie dir das das Leben vereinfachen wird!