Когда использовать сохранение и когда использовать копию
Я смущен тем, что использовать и когда. Есть ли правило? Можно ли в большинстве случаев использовать любой из них? Любые специальные правила?
@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 для создания новой копии массива, и, как вы перечисляете, если вам нужно добавить/удалить объект (мутировать), вы можете сделать это на копии.
Когда вы закончите перечисление, вы можете вернуть копию оригиналу.