Безусловно, добавление «copy» к объявлению свойства противоречит использованию объектно-ориентированной среды, в которой объекты в куче передаются по ссылке - одно из преимуществ, которые вы получаете, заключается в том, что при изменении объекта все ссылки на этот объект увидеть последние изменения. Многие языки предоставляют «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.
В этом случае, без использования копирования, наш контактный объект автоматически принимает новое значение; однако, если бы мы его использовали, нам бы пришлось вручную убедиться, что изменения были обнаружены и синхронизированы. В этом случае сохранение семантики может быть желательным; в другом случае копия может быть более подходящей.
name
быть выпущенdealloc
или нет?