Z pewnością umieszczenie „kopiowania” w deklaracji właściwości jest bardzo trudne w obliczu używania środowiska obiektowego, w którym obiekty na stercie są przekazywane przez referencję - jedną z korzyści, jakie tu otrzymujesz, jest to, że przy zmianie obiektu wszystkie odwołania do tego obiektu zobacz najnowsze zmiany. Wiele języków podaje „ref” lub podobne słowa kluczowe, aby umożliwić typom wartości (tj. Strukturom na stosie) czerpanie korzyści z tego samego zachowania. Osobiście korzystałbym z kopii oszczędnie, a jeśli czułem, że wartość właściwości powinna być chroniona przed zmianami dokonanymi w obiekcie, do którego została przypisana, mógłbym wywołać metodę kopiowania tego obiektu podczas przypisania, np .:
p.name = [someName copy];
Oczywiście, projektując obiekt zawierający tę właściwość, tylko Ty będziesz wiedział, czy projekt korzysta ze wzorca, w którym zadania są kopiowane - Cocoawithlove.com ma następujące zdanie:
„Powinieneś użyć akcesorium kopiującego, gdy parametr ustawiający może być zmienny, ale nie możesz zmienić stanu wewnętrznego właściwości bez ostrzeżenia ” - więc ocena, czy możesz znieść zmianę wartości, należy do ciebie. Wyobraź sobie ten scenariusz:
//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.
W takim przypadku, bez użycia kopii, nasz obiekt kontaktu automatycznie przyjmuje nową wartość; gdybyśmy go jednak użyli, musielibyśmy ręcznie upewnić się, że zmiany zostały wykryte i zsynchronizowane. W takim przypadku zachowanie semantyki może być pożądane; w innym egzemplarz może być bardziej odpowiedni.
name
zostać wydanedealloc
czy nie?