NSArray свойство: скопировать или сохранить? - PullRequest
21 голосов
/ 01 мая 2011

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

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

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

Ответы [ 4 ]

25 голосов
/ 01 мая 2011

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

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

18 голосов
/ 01 мая 2011

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

Я подробно изложил обоснование и несколько последствий здесь:NSMutableString as retain / copy

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

9 голосов
/ 01 мая 2011

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

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

5 голосов
/ 01 мая 2011

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

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

@ jlehr:

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

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

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

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

...