В чем разница между "копировать" и "сохранить"?
в чем разница между 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.
сохранение объекта означает, что число удержаний увеличивается на единицу. Это означает, что экземпляр объекта будет храниться в памяти, пока его количество падает до нуля. Свойство будет хранить ссылку на этот экземпляр и будет совместно использовать тот же экземпляр с любым другим, кто сохранил его. Копировать означает, что объект будет клонирован с повторяющимися значениями. Она не делится ни с кем другим.
сохранить атрибут задан таким, что он может удерживать другой памяти.это можно сделать на другой адрес копировать сначала копирует адрес, а затем сохраняет его.