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