Когда использовать сохранение и когда использовать копию

Я смущен тем, что использовать и когда. Есть ли правило? Можно ли в большинстве случаев использовать любой из них? Любые специальные правила?

@property (nonatomic, retain) NSDate *theDateFromPicker;
@property (nonatomic, copy) NSDate *theDateFromPicker;

В этом случае это лучший выбор?

Спасибо -кода

Ответы

Ответ 1

Вы захотите использовать копию, если не хотите, чтобы объект был модифицирован другим объектом.

Хорошим примером является NSString. Скажем, у вас есть этот код:

@property (nonatomic, retain) NSString *aString;

// in some other class

NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"test"];
theObject.aString = mutableString; // theObject retains the mutable string

[mutableString setString:@"test2"];

Что здесь происходит, так это то, что вы назначаете значение "test" на aString, но затем оно изменяется извне и становится "test2", потому что вы сохранили изменчивую строку. Если вы установили copy, это не произойдет, потому что вы делаете копию изменяемой строки.

Ответ 2

NSDate является неизменным, и в настоящее время у нас нет изменчивого подкласса. Так что сохранить хорошо. Копия тоже не повредит, и я действительно ожидаю, что копия просто вернет тот же самый экземпляр здесь (сохранен еще раз).

Причиной использования копии в NSString является то, что вы можете получить NSMutableString, переданную вашему объекту, вместо этого, которая может измениться прямо под вашими ногами. Этого не может быть здесь.

Ответ 3

В iOS вы обычно работаете с одним потоком, поэтому нет возможности, что ваш объект будет изменен одновременно. Более того, даже если вы укажете copy, свойство все еще можно изменить, просто установив его снова.

Правило большого пальца: "use retain on iOS"

Однако существует несколько ситуаций, когда требуется использование/копирование с использованием копии:

  • должен использовать , если вы принимаете Блокировки (блоки кода, добавленные с iOS4), поскольку блоки должны быть скопированы в кучу перед сохранением (см. Копирование блоков (например: копирование их в переменные экземпляра) в Objective-C для более подробной информации
  • Если вы пишете код, который будет выполняться в фоновом режиме, он безопаснее использовать (атомный, копировать).
  • вам следует рассмотреть возможность использования копии, если вы хотите убедиться, что только присваивание свойства изменит его значение. (это может быть полезно, если вы реализуете KVO)

Ответ 4

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

Ответ 5

С копией у вас будет 2 разных объекта. Поэтому, если вы измените одно, другое не будет изменено.

Ответ 6

Копия дает вам отдельный объект.

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

Хорошее время для использования -copy - это когда вы собираетесь использовать перечисление для добавления или удаления объектов.

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

Когда вы закончите перечисление, вы можете вернуть копию оригиналу.