Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 часто являются атрибутами других настраиваемых объектов, которые вы создаете.