Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
Properties, Teil 2

Im folgen Beispiel soll im Detail der Unterschied zwischen den Attributen retain und copy erklärt werden. Wie zuvor erwähnt, ist retain nur die Übergabe eines Speicherzeigers, während copy tatsächlich eine Kopie des Wertes macht. Das würde bedeuten, dass eine Variable, die mit copy übergeben wurde, auch dann ihren Wert beibehält, wenn sich der originale Wert ändert. Der folgende Code soll diese Behauptung beweisen.
Person *myPerson = [[Person alloc] init];

NSMutableString *nameText = [NSMutableString stringWithCapacity:
5];
[nameText setString:
@"Hans Müller"];

[myPerson nameSchreiben:nameText];

[nameText setString:
@"Fritz Fischer"];

NSLog([myPerson nameLesen]);
Basierend auf dem letzten Beispiel gibt es auch hier wieder ein Objekt myPerson, einer Klasse vom Typ Person. Mit nameSchreiben wird myPerson ein Name zugewiesen. Dieser ist hier allerdings kein Text mehr, sondern nameText, ein NSMutableString. Nachdem der Sting „Hans Müller“ an das Objekt übergeben, wurde wird der Text zu „Fritz Fischer“ geändert.

Das Property in der Klasse verwendet retain. Änderungen am NSMutableString sind gleichzeitig Änderungen an der Variablen der Klasse, da es sich um das selbe Objekt handelt.
@property(setter=nameSchreiben:,getter=nameLesen,retain) NSString *name;
stacks_image_D26A6ECC-2A70-426F-9AA7-BB612F71BDC8
Benutzt das Property hingeben copy, beeinflussen Veränderungen am NSMutableString das Objekt myPerson nicht mehr.
@property(setter=nameSchreiben:,getter=nameLesen,copy) NSString *name;
stacks_image_4FE72CB3-009E-4B2A-960E-0D7737D2B045
Besonders deutlich wird die Beziehung der Variablen natürlich im Debugger. Bei der Verwendung von retain haben beide Variablen den selben Inhalt, weil sie auf die selbe Speicheradresse zeigen.
stacks_image_55FE1D0D-6632-4112-BCC4-B4E7D9B98518
Verwenden sie stattdessen copy, erhalten Sie zwei unabhängige Objekte.
stacks_image_E3A508AE-A7CF-40E2-8610-E362C3441BB5
@property(setter=nameSchreiben:,getter=nameLesen,copy) NSString *name;