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