копировать, сохранять и подсчитывать ссылки в NSString - PullRequest
1 голос
/ 03 января 2012

Что на самом деле означает, когда я использую copy, сохраняю со свойствами NSString и назначаю его локальным переменным?

@interface SomeClass : NSObject 
{ 
   NSString *name; 
   NSString *name2;
} 

@property (nonatomic, retain) NSString* name1;
@property (nonatomic, copy) NSString *name2; 

Если я присваиваю значение строки другой переменной NSString, например:

NSString *newString1 = name1;
NSString *newString2 = name2;

что будет удерживать счетчик name1 и name2?

NSString *anotherString1 = [NSString alloc]initWithString:name1];
NSString *anotherString2 = [NSString alloc]initWithString:name2];

каков будет счетчик имен name1 и name2 здесь?

1 Ответ

6 голосов
/ 03 января 2012

Когда вы выделяете объект, его счет начинается с 1. Каждый раз, когда вы сохраняете, он увеличивается на единицу, а каждый раз, когда вы отпускаете, он уменьшается на единицу. Другим фактором здесь является авто-релиз. Когда объект автоматически освобождается в контексте пула автоматического выпуска, его количество сохранений автоматически уменьшается на единицу при сливе пула автоматического выпуска.

В ваших примерах name1 и newString1 в первом примере будут указателями на один и тот же объект , при этом количество сохраняемых объектов остается неизменным. Это повысится, только если вы явно вызовите retain. То же самое с name2 и newString2. Во втором примере вы выделяете новый экземпляр объекта NSString, так что новые, anotherString1 и anotherString2 сохранят количество единиц 1. name1 и name2 останутся то же самое, опять же, потому что вы не освободили или не сохранили их.

Ваш второй пример по сути такой же, как copy. В то время как retain просто увеличивает счет сохранения объекта, copy создает новый объект со своим собственным счетом хранения. Связанная вещь, которую нужно пометить, указана в объявлении name1 и name2 в качестве свойств. Если вы установите эти свойства, они будут вести себя так, как я здесь описываю, с name1, сохраняя NSString, который вы там установили, и name2, копируя его как новый объект.

Еще один хороший обзор всего этого - здесь , со ссылкой на еще более подробное обсуждение внизу.

Все это, как говорится, в OS X вы можете использовать сборщик мусора, а в iOS 5 автоматический подсчет ссылок . Это может значительно уменьшить, если не устранить, необходимость беспокоиться об этом.

...