Каково различие между “копией”, и “сохраните”?

Между чем различие copy и retain для NSString?

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}
30
задан Lorenzo B 16 February 2015 в 10:13
поделиться

5 ответов

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

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

При работе с NSString, в частности, вы не можете предположить, что тот, кто передает вам NSString, действительно передает вам NSString. Кто-то может передавать вам подкласс (NSMutableString, в данном случае), что означает, что он потенциально может изменять значения под прикрытием. Если ваше приложение зависит от переданного значения, а кто-то изменит его при вас, вы можете столкнуться с проблемами.

46
ответ дан 27 November 2019 в 23:08
поделиться

Сохранение и копирование - две разные вещи, первая концептуально вызывается по ссылке, а вторая - по значению.

24
ответ дан 27 November 2019 в 23:08
поделиться

Самая большая разница в том, что если вы используете copy, объект, который вы копируете, должен реализовать протокол NSCopying (это очень легко сделать). Не каждый объект реализует его, поэтому при попытке вызвать copy нужно быть осторожным и точно знать, с каким типом вы будете работать (или проверить поддержку этого протокола).

Лучшее правило для использования copy, которое я могу придумать, это всегда устанавливать свойства NSString на "copy" вместо retain. Таким образом, вы получите более точные показания инструмента Leaks, если ошибетесь и забудете отпустить строку, за которую держится объект. Другие варианты использования копирования должны быть более тщательно продуманы.

3
ответ дан 27 November 2019 в 23:08
поделиться

копия: создает новый экземпляр, являющийся копией получателя. Это означает, что у вас будет 2 разных

сохранения: Увеличивает keepCount получателя. Объект удаляется из памяти - (с помощью dealloc), когда значение keepCount равно 0.

1
ответ дан 27 November 2019 в 23:08
поделиться

если вы используете retain, он копирует значение указателя с исходного. retain также увеличивает счетчик ссылок на единицу. Но в случае с копией, она дублирует данные, на которые ссылается указатель, и присваивает их переменной экземпляра копии.

5
ответ дан 27 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: