NSString Сохранить счет
Каково количество сохраняемых строк NSString в приведенном ниже фрагменте кода?
self.a = @"abcd"; // self.a is a NSString with (nonatomic, Strong) Attributes
NSLog(@"Retain Count of A == %d",(int)[self.a retainCount]);
self.b = self.a;// self.b is a NSString with (nonatomic, Strong) Attributes
NSLog(@"Retain Count of A == %d",(int)[self.a retainCount]);
NSLog(@"Retain Count of B == %d",(int)[self.b retainCount]);
[self.a release];
NSLog(@"Retain Count of A == %d",(int)[self.a retainCount]);
NSLog(@"Retain Count of B == %d",(int)[self.b retainCount]);
//Similarly whats the retain count if:
self.b = [self.a retain];
1 ответ
@"abcd"
является строковым литералом. Хранится как константа. Если бы вы должны были войти [@"abcd" class]
тогда вы получите __NSCFConstantString
(хотя это эмпирическое наблюдение; имя класса не гарантируется). retain
, release
и т. д. не имеют значения для константной строки, так как она по сути имеет то же время жизни, что и приложение. На практике, как говорит Викингосегундо, вы получаете NSUIntegerMax
,
Вы используете свойства, поэтому то, что на самом деле произойдет, зависит от типа вашего свойства.
С self.b = self.a
то, что вы ожидаете, это:
- добытчик
self.a
возвращается[[string retain] autorelease]
, таким образом, значение счетчика увеличивается на время существования текущего пула автоматического выпуска; - сеттер
self.b =
сохраняет строку, поэтому счет сохранения снова увеличивается на время жизниself
владение строкой.
Таким образом, два приращения, если вы проверите в течение срока службы пула автоматического выпуска, одно долгосрочное приращение.
Ручные звонки retain
а также release
делай то, что думаешь.
В ARC вы не можете вручную вызывать какие-либо из этих вещей, в том числе retainCount
и различные сохранения и релизы могут быть оптимизированы. Известен случай, когда что-то из пула автоматического выпуска, которое впоследствии сохраняется, может быть удалено из пула. Так self.b = self.a
может закончиться подсчетом удержания только одним и строкой, не находящейся в пуле автоматического выпуска, если оптимизатор чувствует, что это так.
Правило при использовании ручного подсчета ссылок довольно простое:
- если у вас есть ссылка-владелец - возвращенная новой, выделенной, сохраненной или скопированной, - отпустите или автоматически освободите ссылку;
- если у вас есть не принадлежащая ссылка - то есть любая другая сортировка, чаще всего, хотя это будет от ванильного сборщика, - тогда не выпускайте ссылку. Но не обязательно ожидать, что он будет действителен после истечения срока действия текущего пула автоматического выпуска.
return [[a retain] autorelease]
картина исходит из наблюдения, что self
может иметь более короткий срок службы, чем бассейн.