Свойство NSArray: скопировать или сохранить?
В соответствии с этим: Свойство NSString: скопировать или сохранить?
Для NSString/NSMutableString рекомендуется копировать.
Как насчет NSArray/NSMutableArray?
Ответы
Ответ 1
выберите copy
, если у вас нет особых причин не для этого, а также для всего поддерживающего кода/интерфейса для резервного копирования.
я подробно объяснил и несколько последствий здесь:
NSMutableString как сохранить/скопировать
этот пример основан на NSString
s, но то же самое относится к NSArray
s.
Ответ 2
Поскольку вы спрашиваете о NSArray (а не NSMutableArray), вы должны использовать копию. NSArray неизменен, поэтому вы не ожидаете изменения свойства этого типа. Но NSMutableArray является подклассом NSArray, поэтому он отлично подходит для передачи кому-либо в NSMutableArray. Если вы просто сохраните этот объект, он может измениться прямо под вашим носом. Если вы скопируете, а не сохраните, объект не изменится.
Однако, вы должны знать, что при копировании контейнера, такого как NSArray, вы копируете только контейнер, а не его содержимое. Если массив содержит изменяемые объекты, содержимое этих объектов может измениться, даже если сам массив является неизменным.
Ответ 3
Если это проблема при изменении базовых данных, используйте копию. Фактически, это то, что вы хотите большую часть времени, поскольку изменение данных за кем-то назад является хорошим источником ошибок.
Обратите внимание, что копия будет по существу просто сохранять для NSArray. Только когда вы набрасываете NSMutableArray, больше работы.
Ответ 4
Из ссылки, которую вы включили, это в значительной степени сводится к следующему: Свойство NSString: скопировать или сохранить?
Если вы хотите убедиться, что значение объекта не изменится во время выполнения, вы используете атрибут copy
, иначе retain
будет в порядке. Как правило, retain
будет нормально для NSMutableArrays и NSArrays (а также многих других объектов), поскольку вы (обычно) больше заинтересованы в объекте, а затем в содержащемся в нем значении. В случае NSString вы всегда заинтересованы в значении, поэтому вы copy
, чтобы убедиться, что он не изменится.
@jlehr:
Это зависит от того, интересует ли разработчик фактическое значение или нет. Всякий раз, когда вы заинтересованы в фактическом значении, используйте копию (так как вы не хотите, чтобы значение менялось во время исполнения), в противном случае сохранение в порядке. Из документов Apple:
В коде Objective-C распространена практика копирования объектов-объектов объектов, представляющих атрибуты. Переменные типа C обычно могут быть заменены объектами значений, но объекты с ценностью имеют преимущество инкапсуляции удобных утилит для обычных манипуляций. Например, объекты NSString используются вместо указателей символов, поскольку они инкапсулируют кодирование и хранение.
Также из документов Apple, по теме объектов значения:
Объект значения по существу является объектно-ориентированной оболочкой для простого элемента данных, такого как строка, число или дата. Классы общих значений в Cocoa являются NSString, NSDate и NSNumber. Объекты Value часто являются атрибутами других настраиваемых объектов, которые вы создаете.