Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS 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_76EF7029-C334-45D0-84F8-F71CD3416EC8
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_75E3131D-2A2C-44A3-86A9-15387239766C
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_51EE9951-0427-4B30-AFC1-28000B7C6D05
Verwenden sie stattdessen copy, erhalten Sie zwei unabhängige Objekte.
stacks_image_F2119927-3FCD-40B6-A767-27BE1946F708
@property(setter=nameSchreiben:,getter=nameLesen,copy) NSString *name;