В чем разница между "копировать" и "сохранить"?

в чем разница между copy и retain на NSString?

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}

9 ответов


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

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

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


сохранение и копирование-это две разные вещи, первая концептуально является call-by-reference, а второй-call-by-value.


сохранить : это делается на созданном объекте, и это просто увеличивает количество ссылок.

скопировать -- Он создает новый объект, и когда новый объект будет создан, сохранить количество будет 1.

надеюсь, что эта помощь для U...:)


старый пост, но вот мой взгляд на вопрос

Retain увеличивает количество удержаний объекта на 1 и становится владельцем объекта.

в то время как copy скопирует данные, присутствующие в местоположении памяти, и назначит его переменной, поэтому в случае копирования вы сначала копируете данные из местоположения, назначаете его переменной, которая увеличивает количество сохранения.

просто помните, что сохранить работы по ссылке и копировать работы на значение


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


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

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


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

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


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


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