Между чем различие copy
и retain
для NSString
?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
В общем случае сохранение объекта увеличивает его счетчик retain на единицу. Это поможет удержать объект в памяти и предотвратить его стирание. Это означает, что если у вас есть только сохраненная версия объекта, вы поделитесь этой копией с тем, кто вам ее передал.
Копирование объекта, как бы вы это ни делали, должно создать другой объект с дублирующими значениями. Считайте это клоном. Вы НЕ делитесь клоном с тем, кто вам его передал.
При работе с NSString
, в частности, вы не можете предположить, что тот, кто передает вам NSString
, действительно передает вам NSString
. Кто-то может передавать вам подкласс (NSMutableString
, в данном случае), что означает, что он потенциально может изменять значения под прикрытием. Если ваше приложение зависит от переданного значения, а кто-то изменит его при вас, вы можете столкнуться с проблемами.
Сохранение и копирование - две разные вещи, первая концептуально вызывается по ссылке, а вторая - по значению.
Самая большая разница в том, что если вы используете copy
, объект, который вы копируете, должен реализовать протокол NSCopying
(это очень легко сделать). Не каждый объект реализует его, поэтому при попытке вызвать copy
нужно быть осторожным и точно знать, с каким типом вы будете работать (или проверить поддержку этого протокола).
Лучшее правило для использования copy
, которое я могу придумать, это всегда устанавливать свойства NSString на "copy" вместо retain. Таким образом, вы получите более точные показания инструмента Leaks, если ошибетесь и забудете отпустить строку, за которую держится объект. Другие варианты использования копирования должны быть более тщательно продуманы.
копия: создает новый экземпляр, являющийся копией получателя. Это означает, что у вас будет 2 разных
сохранения: Увеличивает keepCount
получателя. Объект удаляется из памяти - (с помощью dealloc), когда значение keepCount равно 0.
если вы используете retain, он копирует значение указателя с исходного. retain также увеличивает счетчик ссылок на единицу. Но в случае с копией, она дублирует данные, на которые ссылается указатель, и присваивает их переменной экземпляра копии.