Надлежащее размещение «копии» в объявлении свойства бросает вызов использованию объектно-ориентированной среды, в которой объекты в куче передаются по ссылке - одно из преимуществ, которые вы получаете, заключается в том, что при изменении объекта все ссылки к этому объекту смотрите последние изменения. Многие языки предоставляют «ref» или подобные ключевые слова, чтобы позволить типам значений (то есть структурам в стеке) получить выгоду от того же поведения. Лично я бы использовал копирование экономно, и если бы я чувствовал, что значение свойства должно быть защищено от изменений, внесенных в объект, которому он был назначен, я мог бы вызвать метод копирования этого объекта во время назначения, например ::
.
p.name = [someName copy];
Конечно, при проектировании объекта, содержащего это свойство, только вы будете знать, получает ли дизайн выгоду от шаблона, в котором назначения получают копии - Cocoawithlove.com имеет следующее выражение:
«Вы должны использовать средство доступа к копированию, когда параметр setter может быть изменяемым , но внутреннее состояние свойства не может быть изменено без предупреждения » - так что решение о том, можете ли вы выдержать Значение неожиданного изменения - все ваше. Представьте себе этот сценарий:
//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.
В этом случае, без использования копирования, наш контактный объект автоматически принимает новое значение; если бы мы использовали его, нам бы пришлось вручную убедиться, что изменения были обнаружены и синхронизированы. В этом случае сохранение семантики может быть желательным; в другом случае копия может быть более подходящей.