Sicuramente mettere 'copia' su una dichiarazione di proprietà vola di fronte all'uso di un ambiente orientato agli oggetti in cui gli oggetti sull'heap vengono passati per riferimento - uno dei vantaggi che ottieni qui è che, quando si modifica un oggetto, tutti i riferimenti a quell'oggetto vedere le ultime modifiche. Molte lingue forniscono "ref" o parole chiave simili per consentire ai tipi di valore (ovvero strutture in pila) di beneficiare dello stesso comportamento. Personalmente, userei la copia con parsimonia, e se sentissi che un valore di proprietà dovrebbe essere protetto dalle modifiche apportate all'oggetto da cui è stato assegnato, potrei chiamare il metodo di copia di quell'oggetto durante l'assegnazione, ad esempio:
p.name = [someName copy];
Naturalmente, quando si progetta l'oggetto che contiene quella proprietà, solo tu saprai se il design beneficia di uno schema in cui le assegnazioni prendono copie - Cocoawithlove.com ha il seguente da dire:
"Dovresti usare un accessore di copia quando il parametro setter può essere mutabile ma non puoi avere lo stato interno di una proprietà che cambia senza preavviso " - quindi il giudizio sul fatto che puoi sopportare il valore da modificare inaspettatamente è tutto tuo. Immagina questo scenario:
//person object has details of an individual you're assigning to a contact list.
Contact *contact = [[[Contact alloc] init] autorelease];
contact.name = person.name;
//person changes name
[[person name] setString:@"new name"];
//now both person.name and contact.name are in sync.
In questo caso, senza usare la copia, il nostro oggetto contatto prende automaticamente il nuovo valore; se lo avessimo usato, tuttavia, avremmo dovuto assicurarci manualmente che le modifiche fossero rilevate e sincronizzate. In questo caso, mantenere la semantica potrebbe essere desiderabile; in un altro, la copia potrebbe essere più appropriata.
name
essere rilasciatodealloc
o no?