Свойство NSArray: копировать или сохранять?

Согласно этому: Свойство NSString: копировать или сохранять?

Для NSString / NSMutableString рекомендуется копировать.

Как насчет NSArray / NSMutableArray?


person Howard    schedule 01.05.2011    source источник


Ответы (4)


выберите copy, если у вас нет очень конкретной причины не делать этого, а также весь поддерживающий код / ​​интерфейс для его резервного копирования.

я подробно описал здесь обоснование и некоторые последствия: NSMutableString как сохранить / скопировать

этот пример основан на NSStrings, но то же самое относится к NSArrays.

person justin    schedule 01.05.2011

Поскольку вы спрашиваете о NSArray (а не о NSMutableArray), вам следует использовать копию. NSArray неизменяем, поэтому вы не ожидаете, что свойство этого типа изменится. Но NSMutableArray является подклассом NSArray, поэтому вполне допустимо, чтобы кто-то мог передать NSMutableArray. Если вы просто сохраните этот предмет, он может измениться прямо у вас под носом. Если вы скопируете, а не сохраните, то объект не изменится.

Однако вы должны знать, что при копировании контейнера, такого как NSArray, вы копируете только контейнер, а не его содержимое. Если массив содержит изменяемые объекты, содержимое этих объектов может измениться, даже если сам массив неизменяем.

person Caleb    schedule 01.05.2011
comment
@Caleb Итак, единственное преимущество @property(copy) NSArray *myArray - предотвратить изменение размера массива? Это не препятствует изменению содержимого непослушным мальчиком, который передал NSMutableArray. - person Pwner; 29.07.2015
comment
@Pwner @property(copy) предотвратит изменение содержимого массива в том смысле, что массив будет продолжать ссылаться на одни и те же объекты в том же порядке, но не предотвратит изменение самих отдельных объектов. - person Caleb; 29.07.2015

Если при изменении базовых данных возникает проблема, используйте копию. Фактически, это то, чего вы хотите большую часть времени, поскольку изменение данных за чьей-то спиной - хороший источник ошибок.

Обратите внимание, что копия будет, по сути, просто сохранением для NSArray. Только когда вы добавляете NSMutableArray, требуется больше работы.

person Eiko    schedule 01.05.2011

Судя по включенной вами ссылке, все сводится к следующему: Свойство NSString: копировать или сохранить?

Если вы хотите убедиться, что значение объекта не изменится во время выполнения, используйте атрибут copy, иначе retain подойдет. Как правило, retain подходит для NSMutableArrays и NSArrays (а также многих других объектов), поскольку вас (обычно) больше интересует объект, чем значение, которое он содержит. В случае NSString вас всегда интересует значение, поэтому вы copy убедитесь, что оно не изменится.

@jlehr:

Это зависит от того, интересует ли разработчик фактическая стоимость или нет. Всякий раз, когда вас интересует фактическое значение, используйте copy (поскольку вы не хотите, чтобы значение изменялось во время выполнения), в противном случае сохранить можно. Из документов Apple:

В коде Objective-C обычной практикой является копирование объектов значений - объектов, представляющих атрибуты. Переменные C-типа обычно могут быть заменены объектами значений, но объекты значений имеют то преимущество, что они инкапсулируют удобные утилиты для обычных манипуляций. Например, объекты NSString используются вместо указателей на символы, поскольку они инкапсулируют кодировку и хранение.

Также из документации Apple по теме объектов значений:

Объект значения - это, по сути, объектно-ориентированная оболочка для простого элемента данных, такого как строка, число или дата. Классы общих значений в Какао - это NSString, NSDate и NSNumber. Объекты значений часто являются атрибутами других созданных вами настраиваемых объектов.

person Wolfgang Schreurs    schedule 01.05.2011
comment
Совместное использование содержимого изменяемых коллекций между двумя или более объектами нарушает инкапсуляцию, поэтому Apple рекомендует использовать семантику copy для свойств типа NSArray. - person jlehr; 02.05.2011